GA里需要延迟触发需要使用task,虚幻自带了一些task函数,如果我们想自己实现某些功能需要自定义task。创建一个c++类,继承自UAbilityTask。
task类里需要有3个关键函数:一个静态函数,一个激活任务执行的函数,一个结束任务执行的函数。
UFUNCTION(BlueprintCallable, Category = "Ability|Tasks", meta = (HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "TRUE"))
static UAT_MyTask* myTask(
UGameplayAbility* OwningAbility
);//调用该task使用的函数,该函数至少需要UGameplayAbility*这个参数,可根据自己的需要添加更多参数。
virtual void Activate() override;//task开始触发的函数
virtual void OnDestroy(bool AbilityEnded) override;//task结束触发的函数
在头文件中声明委托,蓝图里调用需要动态多播委托,多播委托类需要以F开头,在GA里进行绑定函数,AT里发送信息执行委托。
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAbilityEnd);//全局范围声明
UPROPERTY(BlueprintAssignable)
FAbilityEnd AbilityEnd;//类里定义
cpp中实现功能:
UAT_MyTask* UAT_MyTask::myTask(UGameplayAbility* OwningAbility)
{
UAT_MyTask* theTask{ NewAbilityTask<UAT_MyTask>(OwningAbility) };//实例化
return theTask;
}
void UAT_MyTask::Activate()
{
AbilityEnd.Broadcast();//这里简单演示,任务开始后立即触发委托并结束。
EndTask();//使用该函数结束任务
}
void UAT_MyTask::OnDestroy(bool AbilityEnded)
{
}
GA调用该TASK
Task = UAT_MyTask::myTask(this);
Task->AbilityEnd.AddDynamic(this,&myAbility::TaskEnd);//绑定委托
Task->ReadyForActivation();//激活任务