Wiki
847 words
4 minutes
GameplayTask & AbilityTask - 游戏任务与能力任务
GameplayTask & AbilityTask - 游戏任务与能力任务
【重点】UGameplayTask 是 Unreal Engine 中用于管理异步、长时间运行操作的基础类。它提供了一种结构化的方式来处理需要等待(例如,等待事件、等待延迟、等待动画完成)的逻辑,而不会阻塞游戏主线程。
在 Gameplay Ability System (GAS) 中,我们通常使用其子类 UAbilityTask。 UAbilityTask 专为在 GameplayAbility 内部使用而设计,并与 ASC 和能力生命周期紧密集成。
UGameplayTask 核心概念
- 异步执行: Task 允许你启动一个操作,然后在未来的某个时间点(当特定条件满足时)得到通知。
- 生命周期管理: Task 自身管理其状态(等待、完成、取消)。
- 所有者 (Owner): 每个 Task 都与一个
IGameplayTaskOwnerInterface相关联(通常是 ASC 或 Controller)。 - 优先级 (Priority): 可以为 Task 设置优先级,用于资源竞争(如同时只有一个 Task 能控制 AI 移动)。
- 资源管理 (Resource Management): 可以声明 Task 需要的资源(如
GameplayTaskResource),系统可以根据优先级仲裁资源分配。
UAbilityTask (Ability Task - 能力任务)
【重点】UAbilityTask 是 UGameplayTask 的子类,专门用于 GameplayAbility 内部。它简化了在能力中执行异步操作的流程。
- 能力绑定: AbilityTask 强绑定到创建它的 GameplayAbility 实例。
- 自动生命周期: 当 GameplayAbility 结束时,它创建的所有 AbilityTask 通常也会被自动清理。
- 委托回调: AbilityTask 通常暴露多个
FGameplayAbilityTaskDelegate委托(如OnComplete,OnCancelled,OnEventReceived),能力可以通过这些委托响应任务的不同结果。 - 简化创建: GameplayAbility 提供了方便的静态工厂方法来创建和激活常见的 AbilityTask(例如
UAbilityTask_WaitDelay::WaitDelay)。
常见 AbilityTask 示例
[[w/unreal/abilitytask_waitdelay|AbilityTask_WaitDelay]]: 等待指定的时间。[[w/unreal/abilitytask_waitgameplayevent|AbilityTask_WaitGameplayEvent]]: 等待特定的 Gameplay Event Tag 被发送到 ASC。[[w/unreal/abilitytask_playmontageandwait|AbilityTask_PlayMontageAndWait]]: 播放 Montage 动画,并在动画结束、中断或触发特定 MontageEvent 时回调。[[w/unreal/abilitytask_waittargetdata|AbilityTask_WaitTargetData]]: 等待玩家或 AI 提供目标数据(FGameplayAbilityTargetData)。常用于需要选择目标点的技能。[[w/unreal/abilitytask_movetolocation|AbilityTask_MoveToLocation]]: 将 AI 控制的角色移动到指定位置。[[w/unreal/abilitytask_waitattributechange|AbilityTask_WaitAttributeChange]]: 等待某个 Attribute 的值满足特定条件。[[w/unreal/abilitytask_waitinputpress|AbilityTask_WaitInputPress]]/[[w/unreal/abilitytask_waitinputrelease|AbilityTask_WaitInputRelease]]: 等待特定的输入 Action 被按下或释放。
如何在能力中使用 AbilityTask
- 创建任务: 在 GameplayAbility 的
ActivateAbility函数中,调用任务的静态工厂方法创建实例。// 示例:创建一个等待延迟的任务UAbilityTask_WaitDelay* WaitDelayTask = UAbilityTask_WaitDelay::WaitDelay(this, /*WaitTime*/ 2.0f); - 绑定委托: 将能力的成员函数绑定到任务的回调委托上。
WaitDelayTask->OnFinish.AddDynamic(this, &UMyGameplayAbility::OnDelayFinished);
- 激活任务: 调用任务的
ReadyForActivation()方法。【注意】这是必需步骤! 否则任务不会开始执行。WaitDelayTask->ReadyForActivation(); - 处理回调: 在绑定的委托函数(如
OnDelayFinished)中编写后续逻辑,例如应用 GameplayEffect 或调用EndAbility。
void UMyGameplayAbility::OnDelayFinished(){ // 延迟结束后执行的操作 ApplyEffectToTarget(); EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);}重要概念链接
- GameplayAbility:AbilityTask 的主要使用者和创建者。
- ASC:通常是 AbilityTask 的所有者。
- Montage:常与
AbilityTask_PlayMontageAndWait配合使用。 - Gameplay Events:
AbilityTask_WaitGameplayEvent监听的目标。 - FGameplayAbilityTargetData:
AbilityTask_WaitTargetData等待的数据类型。
注意事项
- 【注意】只有实例化(Instanced Per Actor 或 Instanced Per Execution)的 GameplayAbility 才能使用 AbilityTask。
- 【注意】务必在创建任务后调用
ReadyForActivation()。 - 【注意】在任务的回调函数中,通常需要根据情况调用 GameplayAbility 的
EndAbility来正确结束能力。 - 【技巧】一个能力可以同时运行多个 AbilityTask,用于处理并行逻辑。
GameplayTask & AbilityTask - 游戏任务与能力任务
https://fuwari.vercel.app/wiki/unreal/gas/gameplaytask/