這次我們要實(shí)現(xiàn)的是一個(gè)治療回血的技能哀墓,它的效果是使用治療技能后角色的生命值會(huì)緩慢恢復(fù)。在這個(gè)效果上擎浴,我們希望實(shí)現(xiàn)通過Gameplay Cue實(shí)現(xiàn)角色使用恢復(fù)技能后身上會(huì)有一個(gè)特效玷禽,再第一次使用技能系統(tǒng)中的Tag標(biāo)簽。
首先還是從設(shè)計(jì)技能的流程開始舵抹。
- 使用技能需要消耗魔法值,但是我們之前創(chuàng)建的AttributeSet中只有生命值劣砍,所以首先需要添加一個(gè)Attribute Mana惧蛹,并初始化。
- 添加恢復(fù)技能刑枝,技能會(huì)播放一個(gè)Montage香嗓,播放完畢后向自己申請(qǐng)一個(gè)Gameplay Effect。該GE的效果是在一定的時(shí)間內(nèi)緩慢地增加生命值装畅。
- 創(chuàng)建一個(gè)Gameplay Cue靠娱,它會(huì)在GE的持續(xù)時(shí)間中在角色身上播放特效。
- 創(chuàng)建一個(gè)碰撞體掠兄,它可以取消帶有某一類Tag的GE像云,這樣我們就可以取消角色身上的治療效果。
法力值A(chǔ)ttribute
打開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);
};
復(fù)制代碼
然后在AttritubteSet.cpp中實(shí)現(xiàn):
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);
}
復(fù)制代碼
這里初始化的方法我還是使用了DataTable蚂夕。在數(shù)據(jù)表中添加一行數(shù)據(jù)迅诬。 如果不想用這種方法,也可以直接在之前創(chuàng)建的GE_AttributeDefault中通過添加一個(gè)Modifier來初始化Mana双抽。
Health Regen Ability
創(chuàng)建Gameplay Ability百框,命名為GA_HealthRegen。
大致的流程比較簡(jiǎn)單牍汹,首先通過Commit Ability來消耗法力值铐维,然后運(yùn)行Task PlayMontageAndWait,隨后向Owner申請(qǐng)一個(gè)Gameplay Effect(這里有個(gè)問題慎菲,應(yīng)該從On Compeleted鏈接Apply嫁蛇,然后從apply gameplay effect連接endability,結(jié)束能力)想了想抑党,覺得這個(gè)技能應(yīng)該還需要一個(gè)冷卻時(shí)間,感謝GAS系統(tǒng)撵摆,它已經(jīng)幫我們?cè)旌昧溯喿拥卓浚獙?shí)現(xiàn)技能冷卻只需要一個(gè)GE即可。創(chuàng)建GE_HealthRegen_Cooldown特铝。
這里的實(shí)現(xiàn)方法為修改Duration Policy為Has Duration暑中,之前我們使用的一直是默認(rèn)的instant壹瘟,表示這個(gè)GE的效果和持續(xù)時(shí)間是瞬時(shí)的。然后設(shè)置Magnitude為5.0最后還需要一個(gè)GE為HealthRegen的技能效果鳄逾,它的持續(xù)時(shí)間同樣應(yīng)該為Has Duration稻轨。創(chuàng)建GE_HealthRegen_Effect。
我們?cè)O(shè)置恢復(fù)效果的持續(xù)時(shí)間為5秒雕凹,在下方的Period從0改為0.2殴俱,表明這個(gè)技能效果每0.2秒觸發(fā)一次,最后添加一個(gè)modifier请琳,設(shè)置每一次觸發(fā)效果為增加生命值2.0Gameplay Cue
創(chuàng)建Gameplay Cue,命名為GC_HealthRegen_Effect竖慧。這里選錯(cuò)了嫌套,應(yīng)該創(chuàng)建的是上面那個(gè)actor。重寫Event HandleGameplayCue圾旨,它可以通過Event Type踱讨,當(dāng)效果剛剛啟動(dòng)后,就會(huì)在擁有者身上添加一個(gè)Emitter砍的,因?yàn)槲也皇翘匦煴陨福@里的特效就用UE4提供的燃燒特效吧,治療效果的特效是燃燒廓鞠,好像沒有什么問題帚稠。
這里連線錯(cuò)誤了,應(yīng)該連在Target上床佳。角色設(shè)置
BeginPlay中Give Ability然后將Ability和輸入綁定昔头。,這里有一個(gè)測(cè)試GE影兽,它的效果是讓角色扣25血揭斧,之前重復(fù)類似的操作太多了,我就不具體展示了赢笨。
運(yùn)行游戲未蝌,看看效果。取消治療效果
首先創(chuàng)建一個(gè)Actor茧妒,然后為它添加一個(gè)Box Collision萧吠。運(yùn)行游戲纸型。
沒有走入actor中,角色身上會(huì)燃燒梅忌。