发布网友 发布时间:2024-10-23 13:58
共1个回答
热心网友 时间:2024-11-11 21:26
在深入探讨虚幻四Gameplay Ability System(GAS)的实现细节前,先分享一段小插曲:我在源码中不慎添加了两句注释,竟导致项目编译失败,面临3000+错误。这让我意识到GAS的复杂性和严谨性。在这篇文章中,我们将聚焦于实现角色的冲刺奔跑功能,以及对GAS中属性(Attribute)的深入理解。如有疑问,欢迎在评论区提问或私信交流。
实现冲刺奔跑功能分为以下几个步骤:
接下来,我们创建MoveSpeed属性。
在AttributeSetBase.h/cpp中添加MoveSpeed属性。此操作已多次执行,假设读者已掌握流程。重要的是了解属性数据结构,查看AttributeSetBase的父类AttributeSet.h。这里展示了属性包含Base Value和Current Value两个浮点值。
Base Value是永久属性的基础值,而Current Value是临时值。例如,加速奔跑功能实际上改变的是Current Value,当效果结束后,Current Value会恢复至默认值。类似地,增益效果会暂时提升角色的生命值或护甲等属性。
与Base Value不同,角色生命值的扣减直接作用于Health属性的Base Value。攻击造成的伤害被视为永久改变,除非有其他影响,否则生命值不会改变。
Base值与Current值的变更方式取决于Gameplay Effect(GE)的Duration Policy。Instant模式改变Base值,Infinite和Has Duration模式改变Current值,因为这些效果有持续时间。当Duration policy包含period时,同样改变Base值,因为Period Duration可视为每个period触发一次的instant。
创建完毕后,给MoveSpeed属性赋予初始值。
实现Sprint技能。创建名为GA_Sprint的游戏能力,作为冲刺技能。创建名为GE_Sprint_SpeedUp的游戏效果,负责提高移动速度。在GE_Sprint_SpeedUp中设置技能效果为永久性,提高MoveSpeed属性2000,同时添加标签Ability.Sprint.SpeedUp。
在GA_Sprint中,向拥有该技能的角色申请一个GE,并等待带有标签Ability.Sprint.EndAbility的Gameplay Event。接收到该事件后,移除带有Ability.Sprint.SpeedUp标签的GE,然后结束能力。
在角色蓝图中,添加能力(Give Ability),绑定输入。当shift松开时,向自己发送带有标签Ability.Sprint.EndSprint的Gameplay Event,作为能力中等待的事件。
实现MoveSpeed属性的改变处理。在CharacterBase.h/cpp中创建一个函数,用于处理移动速度属性值的改变。注意,直接通过GetCharacterMovement()修改移动速度可能导致性能问题。在BeginPlay中将该函数与MoveSpeed的Change Delegate绑定。
处理属性改变的响应。GAS系统提供了接口,在属性值发生改变前进行预处理。重写PreAttributeChange和PostGameplayEffectExecute方法,以设置属性值的范围。例如,确保生命值始终在0到100之间。
通过本文,我们不仅实现了角色的冲刺奔跑功能,还深入探讨了GAS中的属性机制。希望这些知识能帮助你更好地理解和利用GAS系统,以创造更丰富、更细腻的游戏体验。