这次我们要实现的是一个治疗回血的技能,它的效果是使用治疗技能后角色的生命值会缓慢恢复。在这个效果上,我们希望实现通过Gameplay Cue实现角色使用恢复技能后身上会有一个特效,再第一次使用技能系统中的Tag标签。
首先还是从设计技能的流程开始。
- 使用技能需要消耗魔法值,但是我们之前创建的AttributeSet中只有生命值,所以首先需要添加一个Attribute Mana,并初始化。
- 添加恢复技能,技能会播放一个Montage,播放完毕后向自己申请一个Gameplay Effect。该GE的效果是在一定的时间内缓慢地增加生命值。
- 创建一个Gameplay Cue,它会在GE的持续时间中在角色身上播放特效。
- 创建一个碰撞体,它可以取消带有某一类Tag的GE,这样我们就可以取消角色身上的治疗效果。
法力值Attribute
打开Rider, 首先在AttributeSetBase.h添加Mana Attribute
UCLASS()
class GAS_LEARN_API UAttributeSetBase : public UAttributeSet
{
// ......
// Mana
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Attributes", ReplicatedUsing=OnRep_Mana)
FGameplayAttributeData Mana;
ATTRIBUTE_ACCESSORS(UAttributeSetBase, Mana);
UFUNCTION()
virtual void OnRep_Mana(const FGameplayAttributeData& OldMana);
};
然后在AttritubteSet.cpp中实现:
void UAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
// ......
DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, Mana, COND_None, REPNOTIFY_Always);
}
void UAttributeSetBase::OnRep_Mana(const FGameplayAttributeData& OldMana)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Mana, OldMana);
}
这里初始化的方法我还是使用了DataTable。在数据表中添加一行数据。
如果不想用这种方法,也可以直接在之前创建的GE_AttributeDefault中通过添加一个Modifier来初始化Mana。
Health Regen Ability
创建Gameplay Ability,命名为GA_HealthRegen。
大致的流程比较简单,首先通过Commit Ability来消耗法力值,然后运行Task PlayMontageAndWait,随后向Owner申请一个Gameplay Effect(这里有个问题,应该从On Compeleted链接Apply,然后从apply gameplay effect连接endability,结束能力)
这里消耗法力值同样是通过Gameplay Effect,创建GE_HealthRegen_Cost。这里的逻辑比较简单,通过Modifer的Magnitude直接Add(笑) -20的Mana。
想了想,觉得这个技能应该还需要一个冷却时间,感谢GAS系统,它已经帮我们造好了轮子,要实现技能冷却只需要一个GE即可。创建GE_HealthRegen_Cooldown。
这里的实现方法为修改Duration Policy为Has Duration,之前我们使用的一直是默认的instant,表示这个GE的效果和持续时间是瞬时的。然后设置Magnitude为5.0
最后还需要一个GE为HealthRegen的技能效果,它的持续时间同样应该为Has Duration。创建GE_HealthRegen_Effect。
我们设置恢复效果的持续时间为5秒,在下方的Period从0改为0.2,表明这个技能效果每0.2秒触发一次,最后添加一个modifier,设置每一次触发效果为增加生命值2.0
技能所需的所有GE都完成了,再次打开GA_HealthRegen,打开GA的Defualt Settings。将我们刚才实现的Cost和Cooldown效果添加进去。
别忘了把GE添加上去哦(笑)
Gameplay Cue
创建Gameplay Cue,命名为GC_HealthRegen_Effect。这里选错了,应该创建的是上面那个actor。
重写Event HandleGameplayCue,它可以通过Event Type,当效果刚刚启动后,就会在拥有者身上添加一个Emitter,因为我不是特效师,这里的特效就用UE4提供的燃烧特效吧,治疗效果的特效是燃烧,好像没有什么问题。
这里连线错误了,应该连在Target上。
在Default Setting中添加Gameplay Cue Tag中添加一个tag。
为了能够触发这个效果,我们还需要打开GE_HealthRegen_Effect,为这个效果添加一个Gameplay Cue,将它的tag设置为Ability.HealthRegen.Effect。同时将效果的AssetTag也设置为同样的Tag。
角色设置
BeginPlay中Give Ability
然后将Ability和输入绑定。,这里有一个测试GE,它的效果是让角色扣25血,之前重复类似的操作太多了,我就不具体展示了。
运行游戏,看看效果。
取消治疗效果
首先创建一个Actor,然后为它添加一个Box Collision。
通过Remove Active Effect With Tags,移除角色身上带有Ability.HealthRegen.Effect标签的效果。
运行游戏。
没有走入actor中,角色身上会燃烧。
走入actor后,燃烧效果被移除了。