我们在操作蓝图的过程中经常有类似定时器、异步任务等需求,用默认蓝图节点虽然也能完成,但看起来较为繁琐,其实可以通过继承C++异步蓝图动作类来实现。
1.首先创建一个C++类,继承UBlueprintAsyncActionBase:

2.编写该异步节点的h文件和cpp文件。
这里定义了一个回调委托AsyncActionCallback,可以在异步节点触发结束时调用。
AsyncAction为蓝图调用的函数体,通常实例化一个新的对象并返回,例如在蓝图中调用了2次AsyncAction异步节点,实际上就会创建2个对象。所以放到Tick事件里触发就会调用若干次异步节点导致编辑器卡死
Activate是异步节点实际处理的逻辑。
.h:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "MyBlueprintAsyncActionBase.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAsyncActionCallback);
UCLASS()
class MYPROJECT_API UMyBlueprintAsyncActionBase : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable)
FAsyncActionCallback OnFinished;
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
static UMyBlueprintAsyncActionBase* AsyncAction();
UMyBlueprintAsyncActionBase();
private:
bool AsyncActionFlag;
virtual void Activate() override;
};
.cpp:
#include "MyBlueprintAsyncActionBase.h"
UMyBlueprintAsyncActionBase* UMyBlueprintAsyncActionBase::AsyncAction()
{
UMyBlueprintAsyncActionBase* Ret = NewObject<UMyBlueprintAsyncActionBase>();
return Ret;
}
UMyBlueprintAsyncActionBase::UMyBlueprintAsyncActionBase()
{
AsyncActionFlag = false;
}
void UMyBlueprintAsyncActionBase::Activate()
{
Super::Activate();
Async(EAsyncExecution::ThreadPool, [&]()
{
AsyncActionFlag = true;
FPlatformProcess::Sleep(5.0f);
OnFinished.Broadcast();
});
}
编译后,新建一个Actor蓝图,在BeginPlay事件处调用,OnFinished在异步逻辑结束后触发。


1747

被折叠的 条评论
为什么被折叠?



