UE4 蓝图多个执行节点实现

#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"));
}

以上为异步多个执行节点


你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你和你的朋友吃完饭,付了钱,舒舒服服的去商场购物了,一次饭局就结束了。这就是同步调用。

如今,我们正处在互联网时代,当你们饿的时候,就打开饿了么,点了一桌满汉全席,支付了餐费,这时你就完成了点菜。商家接到了你的订单之后,就会马上开始安排(毕竟顾客就是上帝嘛)。现在你们无须默默等待,以免被饿所折磨,于是你们打开了京东,开始了新的购物。当饿了么小哥饭菜送到时,一签单就完事了,并且你们也完成了购物。这就是异步调用。
 

引用:同步和异步_西红柿丶番茄的博客-CSDN博客_同步 异步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值