UE中定义异步函数
一个 UBlueprintAsyncActionBase 类并不限制只能有一个异步函数。你可以在同一个类中定义多个异步蓝图函数,只需确保每个函数都正确实现异步逻辑,并且可以有不同的输入参数和回调逻辑。
下面是如何在同一个类中定义多个异步蓝图函数的示例:
示例:添加多个异步函数
- 修改头文件以包含多个异步函数
你可以在头文件中定义多个异步函数,并为每个函数声明不同的成员变量。
// AsyncBlueprintFunction.h
#pragma once
#include "Kismet/BlueprintAsyncActionBase.h"
#include "AsyncBlueprintFunction.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAsyncFunctionCompletedWithResult, int32, Result);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAsyncFunctionCompletedNoResult);
UCLASS()
class YOURPROJECT_API UAsyncBlueprintFunction : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
// 异步任务的完成事件
UPROPERTY(BlueprintAssignable)
FAsyncFunctionCompletedWithResult OnSuccessWithResult;
UPROPERTY(BlueprintAssignable)
FAsyncFunctionCompletedNoResult OnSuccessNoResult;
// 带参数的异步函数
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"), Category = "Async")
static UAsyncBlueprintFunction* AsyncFunctionWithResult(UObject* WorldContextObject, int32 InputValue);
// 不带参数的异步函数
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"), Category = "Async")
static UAsyncBlueprintFunction* AsyncFunctionNoResult(UObject* WorldContextObject);
virtual void Activate() override;
private:
UObject* WorldContextObject;
// 用于存储传递的参数
int32 InputValue;
bool bHasResult;
// 异步任务实现
void ExecuteTaskWithResult();
void ExecuteTaskNoResult();
};
- 实现多个异步函数的逻辑
在 .cpp 文件中分别实现每个函数的异步逻辑。你可以根据是否需要参数或返回值来区分。
// AsyncBlueprintFunction.cpp
#include "AsyncBlueprintFunction.h"
#include "Engine/World.h"
#include "Async/Async.h"
// 带参数的异步函数
UAsyncBlueprintFunction* UAsyncBlueprintFunction::AsyncFunctionWithResult(UObject* WorldContextObject, int32 InputValue)
{
UAsyncBlueprintFunction* Node = NewObject<UAsyncBlueprintFunction>();
Node->WorldContextObject = WorldContextObject;
Node->InputValue = InputValue;
Node->bHasResult = true; // 表示这个函数有结果返回
return Node;
}
// 不带参数的异步函数
UAsyncBlueprintFunction* UAsyncBlueprintFunction::AsyncFunctionNoResult(UObject* WorldContextObject)
{
UAsyncBlueprintFunction* Node = NewObject<UAsyncBlueprintFunction>();
Node->WorldContextObject = WorldContextObject;
Node->bHasResult = false; // 表示这个函数没有结果返回
return Node;
}
// 根据函数类型选择不同的执行逻辑
void UAsyncBlueprintFunction::Activate()
{
if (bHasResult)
{
ExecuteTaskWithResult();
}
else
{
ExecuteTaskNoResult();
}
}
// 带返回值的任务
void UAsyncBlueprintFunction::ExecuteTaskWithResult()
{
AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this]()
{
int32 Result = InputValue * 2; // 使用传递的参数计算
FPlatformProcess::Sleep(2.0f); // 模拟耗时操作
AsyncTask(ENamedThreads::GameThread, [this, Result]()
{
OnSuccessWithResult.Broadcast(Result);
SetReadyToDestroy();
});
});
}
// 不带返回值的任务
void UAsyncBlueprintFunction::ExecuteTaskNoResult()
{
AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this]()
{
FPlatformProcess::Sleep(2.0f); // 模拟耗时操作
AsyncTask(ENamedThreads::GameThread, [this]()
{
OnSuccessNoResult.Broadcast();
SetReadyToDestroy();
});
});
}
- 在蓝图中使用
编译后,在蓝图编辑器中你会看到两个异步蓝图函数:
AsyncFunctionWithResult:接受一个 InputValue 参数并返回一个 Result 值。
AsyncFunctionNoResult:不接受参数,也不返回值,但有一个完成事件。
总结
你可以在同一个 UBlueprintAsyncActionBase 类中定义多个异步蓝图函数。
每个函数可以有不同的输入参数和处理逻辑。
通过 Activate 方法区分不同函数的执行逻辑。
使用多个 UPROPERTY 来分别定义各个函数的回调事件。
这种方式使得你能够在一个类中实现多个异步任务,并且每个任务都可以具有不同的参数和返回值。