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。
