AbilityTask:GA 的异步任务

GE 与属性是同步的"瞬间操作",但技能是有过程的:播动画、等输入、等位置、飞到目标、产生爆炸。AbilityTask 就是 GA 的"协程"。

常用 Task 速查

Task 作用
PlayMontageAndWait 播蒙太奇,等待结束/中断
WaitInputPress / WaitInputRelease 等待按键按下/松开(蓄力)
WaitTargetData 等目标选择(TargetActor,下文)
AbilityTask_MoveTo(自带/自定义) 移动到目标
WaitOverlap 等待碰撞重叠
SpawnProjectile(自定义 Task) 生成飞行物
WaitGameplayEvent 等事件(见下页)
Delay / Repeat 流程控制

一个"前摇 → 生效 → 后摇"的 GA

蓝图:

Event ActivateAbility
   → PlayMontageAndWait(A_Cast)
      → OnBlendOut / On Interrupted → CancelAbility(被打断)
      → OnCompleted → 生效分支
         → CommitAbility
         → Apply Gameplay Effect to Target(伤害 GE)
         → EndAbility

要点:PlayMontageAndWait 的"完成"回调由蒙太奇动画播放结束触发;命中判定可以用蒙太奇里的 Anim Notify → 触发一个 GameplayEvent → GA 用 WaitGameplayEvent 接(下页)。

Task 的多分支:蓝图上的"多输出"

AbilityTask 节点大多有多个输出引脚(OnCompleted / OnInterrupted / OnCanceled),把"成功/失败/打断"的分支画在一张图里——这是 GA 蓝图的一大特色,也是它比"事件图表 + Delay"更可靠的原因(动画状态变化会被正确通知)。

自定义 Task

UCLASS()
class UAT_SpawnProjectile : public UAbilityTask
{
    GENERATED_BODY()
public:
    UAT_SpawnProjectile* SpawnProjectile(UGameplayAbility* OwningAbility, TSubclassOf<AActor> Class);
    virtual void Activate() override;
};

规则:继承 UAbilityTask,提供静态工厂函数,在 Activate() 里开始工作,结束时调 EndTask()。自定义 Task 是 GA 蓝图复用代码的正确载体(比函数更"异步友好")。

与第 1 本的呼应

第 1 本"技能系统骨架"里用 Timer / Delay 手搓的流程,在 GAS 里全是 Task。两个系统的对照:

手写方案 GAS 方案
蒙太奇 + Timer + 手动状态机 PlayMontageAndWait + 回调
手写"等待输入保持 1 秒" WaitInputPress + Delay
手写目标选择 WaitTargetData + TargetActor

本章小结

  • AbilityTask 是 GA 的协程:异步、多回调分支、可自定义。
  • 标准三件套:PlayMontageAndWait / WaitInputPress / WaitTargetData。
  • 自定义 Task 继承 UAbilityTask + 工厂函数 + Activate/EndTask。