Ability Task
Ability Task是Gameplay Task的子類枣宫,只能被GameplayAbilities使用。Gameplay Task更通用蒸绩,不僅僅用在Game Ability System中车柠,也可用來給AI發(fā)送命令相种,或是實(shí)現(xiàn)Delay的效果。它的一個重要特性:類似Unity中的協(xié)程积仗,是異步的秩冈,不會阻塞Update。
既然我們是在研究GAS斥扛,這里主要討論Ability Task入问。Unreal Engine中已經(jīng)提供了不少Ability Task類。
Ability Task在Gameplay Ability的執(zhí)行過程中調(diào)用稀颁,通過Delegate(C++)和其他Exec Pin(Blueprint)來影響Ability的執(zhí)行芬失。一個典型的應(yīng)用是等待外部給予輸入(注意到API圖中一堆的Wait)。Task可以隨時調(diào)用EndTask來終止匾灶,當(dāng)Ability調(diào)用EndAbility時棱烂,也會終止相應(yīng)的所有Tasks。ActionRPG中使用Ability Task的例子:
其中PlayMontageAndWaitForEvent就是一個自定義的Ability Task阶女。后文將會介紹如何自定義Ability Task颊糜。
Ability Task也可以在網(wǎng)絡(luò)環(huán)境中使用,但Ability Task本身不直接參與replication秃踩,而是由Gameplay Ability(Replicated)來間接同步衬鱼。對于Engine提供的Ability Task,可以放心食用憔杨,自定義Task時要小心鸟赫。
Custom Ability Task
繼承自UAbilityTask后,需要聲明一個static函數(shù)消别,為這個AbilityTask在藍(lán)圖中生成節(jié)點(diǎn)抛蚤。這里參考https://wiki.unrealengine.com/GameplayAbilities_and_You#GameplayTasks
中的說明,如果你的新AbilityTask類為UAbilityTask_MyTask寻狂,則相應(yīng)的static函數(shù)為:
注意聲明中UFUNCTION中的修飾符岁经,其中BlueprintInternalUseOnly = "True"有點(diǎn)難理解。事實(shí)上是所有AbilityTask默認(rèn)是異步的蛇券,你的靜態(tài)函數(shù)并不是對應(yīng)的藍(lán)圖生成task節(jié)點(diǎn)缀壤,它只是這個藍(lán)圖節(jié)點(diǎn)的一部分實(shí)現(xiàn)朽们,另一部引擎幫你完成了,至于這塊是什么诉位,我暫時沒去研究骑脱。所以BlueprintInternalUseOnly = "True"來阻止BlueprintCallable自動生成藍(lán)圖節(jié)點(diǎn)。
插播:當(dāng)不知道該用怎樣的修飾符時就去翻引擎中實(shí)現(xiàn)類似功能的代碼苍糠,復(fù)制粘貼Hァ!岳瞭!
我們在來看下ActionRPG中的例子:
為了添加其他Exec Pin拥娄,我們要聲明Delegate,關(guān)于具體實(shí)現(xiàn)為:
注意delegate的類型為DLECALRE_DYNAMIC_MULTICAST(_XXX)瞳筏,其中的Broadcast需要在Activate函數(shù)中調(diào)用稚瘾。delegate的使用例子如下:
在看看ActionRPG中: