UE中定义异步函数

UE中定义异步函数

一个 UBlueprintAsyncActionBase 类并不限制只能有一个异步函数。你可以在同一个类中定义多个异步蓝图函数,只需确保每个函数都正确实现异步逻辑,并且可以有不同的输入参数和回调逻辑。
下面是如何在同一个类中定义多个异步蓝图函数的示例:
示例:添加多个异步函数

  1. 修改头文件以包含多个异步函数
    你可以在头文件中定义多个异步函数,并为每个函数声明不同的成员变量。
// 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();
};

  1. 实现多个异步函数的逻辑
    在 .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();
        });
    });
}

  1. 在蓝图中使用
    编译后,在蓝图编辑器中你会看到两个异步蓝图函数:
    AsyncFunctionWithResult:接受一个 InputValue 参数并返回一个 Result 值。
    AsyncFunctionNoResult:不接受参数,也不返回值,但有一个完成事件。
    总结
    你可以在同一个 UBlueprintAsyncActionBase 类中定义多个异步蓝图函数。
    每个函数可以有不同的输入参数和处理逻辑。
    通过 Activate 方法区分不同函数的执行逻辑。
    使用多个 UPROPERTY 来分别定义各个函数的回调事件。
    这种方式使得你能够在一个类中实现多个异步任务,并且每个任务都可以具有不同的参数和返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值