Skip to the content.

蓝图函数异步节点

在蓝图中类似delay节点亦或DownloadImage节点,会等待某个条件或是任务完成才会执行某个exec node
这里以延迟一帧为例
继承UBlueprintAsyncActionBase

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "DelayOneFrame.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDelayOneFrameOutputPin,float,OneParam);

/**
 * 
 */
UCLASS()
class MULTITHREADPROJECT_API UDelayOneFrame : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()
	
public:

    ///异步执行的节点 想要多节点可以多塞几个成员变量
	UPROPERTY(BlueprintAssignable)
	FDelayOneFrameOutputPin AfterOneFrame;

    ///开放给蓝图的函数节点
	UFUNCTION(BlueprintCallable,meta = (BlueprintInternalUseOnly = "true",WorldContext = "WorldContextObject"),Category = "Flow Control")
	static UDelayOneFrame* WaitForOneFrame(const UObject* WorldContextObject,const float SomeInputVariables);

    ///该节点激活时执行函数 这里用于使用计时器等待一帧的时间
	virtual  void Activate() override;

    
	void ExecuteAfterOneFrame();
	
private:
	const UObject* WorldContextObject = nullptr;

    /// 函数入参 这里没有实际使用到
	float MyFloatInput = 0.0f;
	
};
#include "DelayOneFrame.h"

UDelayOneFrame* UDelayOneFrame::WaitForOneFrame(const UObject* WorldContextObject, const float SomeInputVariables)
{

	UDelayOneFrame* BlueprintNode = NewObject<UDelayOneFrame>();
	BlueprintNode->WorldContextObject = WorldContextObject;

	BlueprintNode->MyFloatInput = SomeInputVariables;

	return  BlueprintNode;
}

void UDelayOneFrame::Activate()
{
	Super::Activate();

	WorldContextObject->GetWorld()->GetTimerManager().SetTimerForNextTick(this,&UDelayOneFrame::ExecuteAfterOneFrame);

	
}

void UDelayOneFrame::ExecuteAfterOneFrame()
{
	AfterOneFrame.Broadcast(MyFloatInput);
}