1.3版本
这是针对UE5.4的最后一次更新,1.3以上版本则会在UE5.5上进行开发。
很多更新细节体现在了演示项目,这里主要罗列一些主要修改。
战斗流程
新增:AttackResultProcessor支持WorldContext,意味着在蓝图中可以使用更多的节点(比如SpawnActor)。
碰撞检测系统
碰撞检测实例不再使用GameplayEventData作为TraceInformation,并由Set/GetTraceSource和Set/GetAttackRequest代替。
提供AsyncAction_CollisionTrace,方便使用。
子弹系统改进
修复:正确同步Hit事件。
改进:子弹的Trace信息放在子弹定义上,同样支持一个子弹关联多个Trace。
改进:子弹现在可以配置是否穿透角色,场景。
改进:子弹系统进一步完善,支持穿透,子弹命中生成子弹(链)
演示内容改进
武器相关的TargetingPreset会过滤掉武器类型Actor。
移除演示内容中的Posture(躯干)属性,因为这太特定于游戏机制了:用户仍然可以完美防御/弹反,但其造成的结果可以自行定义。
将DemoCombatCore中的运动控制逻辑单独解耦为一个简单的运动系统,1是为了可以在不同的项目中不用重新造轮子,2是提供更清晰的战斗系统整合任意运动系统的方式。
修正武器动画层在某些情况下没有正常link/unlink。
碰撞检测系统
规范TargetingSourceContext的用法。
TraceInstance使用TargetingSystem进行目标获取。其中,TargetingSourceContext中的内容如下:
SourceActor是与Trace关联的PrimitiveComponent的Owner,如:Trace捆绑的武器Mesh,SourceActor就是武器;Trace捆绑的子弹的Shape,SourceActor就是子弹。
InstigatorActor:所有的Trace实例都由CollisionSystem组件创建和管理,所以CollisionSystem组件的Owner就是InstigatorActor。
锁定系统
“LockIndicator组件”强化了,你可以填一堆Indicator定义,当角色被锁定后会自动创建WidgetComponent并与UI进行关联。默认情况下,只有LockOn UI和角色血条UI会在被锁定时显示。
简单来说,这是一个方便地在被锁定目标上动态创建一堆世界UI的组件。
阵营系统
GCS_CombatTeamAgentComponent
允许在设置TeamId时,也会同步设置到Pawn所属的Controller上(如果Controller实现了GenericTeamAgentInterface
)
迁移指南
打开你项目的DefaultGameplayTags.ini,并在[/Script/GameplayTags.GameplayTagsSettings]
下添加如下的Tag重定向。
1[/Script/GameplayTags.GameplayTagsSettings]2+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Tailsman",NewTagName="GIS.Item.Tailsman")3+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon",NewTagName="GIS.Item.Weapon")4+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.Axe",NewTagName="GIS.Item.Weapon.Axe")5+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.BowAndArrow",NewTagName="GIS.Item.Weapon.Bow")6+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.GreatSword",NewTagName="GIS.Item.Weapon.GreatSword")7+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.Hammer",NewTagName="GIS.Item.Weapon.Hammer")8+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.Pistol",NewTagName="GIS.Item.Weapon.Pistol")9+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type.Weapon.Sword",NewTagName="GIS.Item.Weapon.Sword")10+GameplayTagRedirects=(OldTagName="GIS.Item.Type.Skill",NewTagName="GIS.Item.Skill")11+GameplayTagRedirects=(OldTagName="GIS.Item.Type.Potion",NewTagName="GIS.Item.Consumable")12+GameplayTagRedirects=(OldTagName="GIS.Equipment.Type",NewTagName="GIS.Item")13+GameplayTagRedirects=(OldTagName="GIS.Item.Type",NewTagName="GIS.Item")14从1.3开始,必须使用GCS_AbilitySystemGlobals,你可以参考案例项目中的DefaultGame.ini15[/Script/GameplayAbilities.AbilitySystemGlobals]16+GlobalAttributeSetDefaultsTableNames="/Game/GenericGame/CombatSystem/Extras/DataTables/CT_GCS_DefaultStats"/Script/Engine.CurveTable'/Game/GenericGame/CombatSystem/Extras/DataTables/CT_GCS_DefaultStats.CT_GCS_DefaultStats'17AbilitySystemGlobalsClassName="/Script/GenericCombatSystem.GCS_AbilitySystemGlobals"18+GameplayCueNotifyPaths=/Game/GenericGame/CombatSystem/Extras/Cues19;AbilitySystemGlobalsClassName="/Script/GenericGameplayAbilities.GGA_AbilitySystemGlobals"20PredictTargetGameplayEffects=true21bUseDebugTargetFromHud=true
1.2版本
碰撞检测系统
新增:CollisionTraceDefinition,CollisionSystem组件可以配置默认碰撞检测实例。
新增:可以通过CollisionSystem监听任意碰撞检测实例的激活状态变化:TraceInstanceStateChanged。
新增:通过一组碰撞检测定义生成碰撞检测实例。
改进:支持手动/自动处初始化碰撞检测系统。
武器系统
新增:武器支持一个Mesh绑定多个碰撞检测实例,并由SocketPrefix区分。
新增:武器Hit,支持播放ContextEffects,用于和物理环境进行交互。
弃用:原本武器上的Trace开头的配置已经删除。
更改:OnTraceHit变成了OnAnyTraceHit。OnTraceStateChanged变成OnAnyTraceStateChanged。
定位系统
更改:TP_GCS_Trace_WeaponSockets
可以扫描任意对象,而不仅仅是Pawn,这样可以允许击中物理环境。
子弹系统
修正:当子弹重生时,确保根据子弹定义刷新对应的视觉资产,避免指定的特效/音效资产驻留。
技能系统
改进:改进Dodge技能的逻辑,手动修正角色朝向变成可选。添加更多类型的错误检查。
改进:WeaponFire在联机模式下得到修正,只在服务端生成子弹,且使用正确的Bullet LineTrace Task来获取目标点。
多人系统
改进:CombatCore组件的初始化逻辑,避免多人情况下的时候出现报错。
改进:AbilityTask_CollisionTrace添加可选的bAdjustAnimTickOption,如果勾选,会在DedicatedServer模式下,临时将角色骨骼网格体的刷新模式设置为AlwaysTickPoseAndRefreshBones
,这使得在基于近战的战斗中,依赖骨骼位置的相关战斗逻辑可以正常工作。
参考内容
改进:调整免费动画的MotionWarping通知,确保攻击时可以更改玩家输入。
新增:AirAttack支持空中连招。
开发体验
新增:战斗系统项目设置,允许全局禁用阵营判定,方便测试友军伤害,而无需挨个调整队伍ID。
新增:GetMainCharacterMeshComponent,不直接通过Cast成Character取Mesh组件,而是通过此组件进行查询。