(65)


bash
蓝图调用静态函数(如 MyAsyncAction::DoSomething())
│
▼
NewObject 创建 UObject 实例
│
▼
Activate() 被调用 ← 你在这里写异步逻辑(开线程/AsyncTask/Tick等)
│
▼
完成后 Broadcast 委托
│
▼
蓝图中 Exec 引脚触发,继续往下走
规范写法(必须这么写才能被识别) :
cpp
// .h
UCLASS()
class UMyAsyncAction : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
// ① 静态工厂函数------必须 static + BlueprintCallable
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
static UMyAsyncAction* DoSomething(UObject* WorldContextObject, float Delay);
// ② 委托------必须 BlueprintAssignable,蓝图中会变成 Exec 引脚
UPROPERTY(BlueprintAssignable)
FMyDelegate OnCompleted;
// ③ 重写 Activate------异步逻辑入口
virtual void Activate() override;
private:
float InternalDelay;
};
++ 以及 :
cpp
// .cpp
UMyAsyncAction* UMyAsyncAction::DoSomething(UObject* WorldContextObject, float Delay)
{
UMyAsyncAction* Node = NewObject<UMyAsyncAction>();
Node->InternalDelay = Delay;
Node->RegisterWithGameInstance(); // 防止被 GC 回收
return Node;
}
void UMyAsyncAction::Activate()
{
// 异步执行,不阻塞蓝图
AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this]()
{
FPlatformProcess::Sleep(InternalDelay);
// 回到游戏线程广播结果
AsyncTask(ENamedThreads::GameThread, [this]()
{
OnCompleted.Broadcast();
SetReadyToDestroy(); // 标记可回收
});
});
}
++ 蓝图中长什么样 :
bash
[Exec In] ──→ [DoSomething] ──→ [Then] (Exec 输出)
│
└──→ [Completed] (委托事件,可绑定)

(66)
谢谢