#include "Async/AsyncWork.h"
#include "CoreMinimal.h"
#include "WJLAsyncTask.generated.h"
UENUM(BlueprintType)
enum class EBlueprintExecNodePin : uint8 {
Success,
Fail
};
UCLASS()
class REFLECTIONCLASSFUNC_API AWJLAsyncTask : public AActor
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Result"))
AWJLAsyncTask* WaitTickTestActorCounter(UObject* WorldContextObject/*, ATickTestActor* TickTestActor*/, EBlueprintExecNodePin &Result);
};
#include "WJLAsyncTask.h"
AWJLAsyncTask* AWJLAsyncTask::WaitTickTestActorCounter(UObject* WorldContextObject/*, ATickTestActor* TickTestActor*/, EBlueprintExecNodePin& Result) {
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, L"123");
Result = EBlueprintExecNodePin::Success;
Result = EBlueprintExecNodePin::Fail;
return nullptr;
}
以上为同步时的多节点输出,Result最后只能输出一个,谁最后赋值,就是从哪个执行节点出来,比如,以上代码最后执行节点为Fail,所以蓝图只能从Fail执行出来打印Hello
注意:这两个名字必须是一致的
#pragma once
#include "Async/AsyncWork.h"
#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "WJLAsyncTask.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyAsyncTaskNodeResult, int32, Result);
/**
*
*/
UENUM(BlueprintType)
enum class EBlueprintExecNodePin : uint8 {
Success,
Fail,
};
UCLASS()
class REFLECTIONCLASSFUNC_API UWJLAsyncTask : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable)
FMyAsyncTaskNodeResult OnSuccess;
UPROPERTY(BlueprintAssignable)
FMyAsyncTaskNodeResult OnFail;
UPROPERTY(BlueprintAssignable)
FMyAsyncTaskNodeResult Mid;
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Result"))
UWJLAsyncTask* WaitTickTestActorCounter(UObject* WorldContextObject/*, ATickTestActor* TickTestActor*/, EBlueprintExecNodePin &Result);
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", Delay = "0.5"))
static UWJLAsyncTask* AsyncDelay(UObject* WorldContextObject, float DelayTime);
protected:
void TimeOutCallBack();
};
#include "WJLAsyncTask.h"
UWJLAsyncTask* UWJLAsyncTask::WaitTickTestActorCounter(UObject* WorldContextObject/*, ATickTestActor* TickTestActor*/, EBlueprintExecNodePin& Result) {
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, L"123");
Result = EBlueprintExecNodePin::Success;
Result = EBlueprintExecNodePin::Fail;
return nullptr;
}
UWJLAsyncTask* UWJLAsyncTask::AsyncDelay(UObject* WorldContextObject, float DelayTime) {
UWJLAsyncTask* Node = NewObject<UWJLAsyncTask>();
//构建定时器
FTimerHandle Handle;
WorldContextObject->GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateUObject(Node, &UWJLAsyncTask::TimeOutCallBack), DelayTime, false);
return Node;
}
void UWJLAsyncTask::TimeOutCallBack()
{
if (OnSuccess.IsBound())
{
OnSuccess.Broadcast(10);
}
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, TEXT("111"));
}
以上为异步多个执行节点
你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你和你的朋友吃完饭,付了钱,舒舒服服的去商场购物了,一次饭局就结束了。这就是同步调用。
如今,我们正处在互联网时代,当你们饿的时候,就打开饿了么,点了一桌满汉全席,支付了餐费,这时你就完成了点菜。商家接到了你的订单之后,就会马上开始安排(毕竟顾客就是上帝嘛)。现在你们无须默默等待,以免被饿所折磨,于是你们打开了京东,开始了新的购物。当饿了么小哥饭菜送到时,一签单就完事了,并且你们也完成了购物。这就是异步调用。