虚幻四Gameplay Ability System入门(1)
这一篇的目的实现一个简单的攻击Ability。在开始之前,首先设计一下在蓝图中角色的普通攻击是如何实现的:
- 鼠标左键启动攻击事件
- 攻击事件开始,播放montage。
- montage中有notify,作用分别是启动攻击碰撞检测,取消碰撞检测,效果类似于伤害帧
- 如果发生碰撞,通过ApplyDamage对敌人造成伤害
- montage播放完成,结束攻击事件。
在GAS系统中,我们应该把攻击看做一个完整的Ability,那么它负责的部分应该包括2,4,5,角色本身负责的部分应该是1,4。这样我们就将攻击的逻辑分解完成。
接下来开始实现。
创建攻击Ability
命名为GA_MeleeAttack,然后打开角色蓝图
在BeginPlay中将普通攻击能力给予技能系统,然后给鼠标左键添加事件,启动普通攻击能力。
实现攻击的碰撞检测
打开角色的mesh,可以看到角色右手手掌的地方有一个名字为weapon_r的socket,我们将会在这个socket的位置添加一个球形碰撞器来检测攻击。如果使用自己的模型,没有这个socket,可以手动添加。
添加完毕后,Sphere只需要检测和Pawn的碰撞,重写begin overlap事件
如果发生碰撞,则会向角色自己发送一个Gameplay Event,这个事件将会在接下来实现的攻击能力中被响应,注意,这里的event tag应该是Ability.Melee.DealDamage,表明这个事件为响应普通攻击的造成伤害。标签需要自己手动添加。事件的data中,需要将被造成伤害的目标作为数据发送过去。
此外,我们希望的是只有主角的播放攻击动画的时候才会发生碰撞检测,所以需要添加两个Custum Event,同时在开始设置Sphere没有碰撞。
角色部分的代码完成。
普通攻击Montage
创建一个AnimNotify_State。命名为AN_Melee
打开后override两个函数,Receive Notify Begin和Receive Notify End。
然后创建并打开自己的攻击动画Montage
在合适的位置添加Notify_State,AN_Melee
普通攻击Ability
接下来,为了实现攻击的效果,我们需要一个Gameplay Effect去制造伤害。命名为GE_Melee_DealDamge
打开蓝图后,添加一个Modifier,修改Health,修改方式为-20
接下来打开GA_MeleeAttack
大致的实现流程是,首先添加Task,PlayMontageAndWait,然后等待一个Gameplay Event,这个事件就是之前在角色部分添加的发生碰撞后发送的事件,接收到event后,就向target apply一个gameplayeffect,这个GE就是我们刚刚实现的GE_Melee_DealDamage.
测试
添加一个BP_Character到游戏里,开始游戏。
在GA_Melee中添加一个测试,打印受到伤害后的角色生命值
可以看到被攻击的对象血量从0变成了-20。完成,下一篇文章会实现UI和GAS的关联。