UE4中添加异步蓝图节点(定时节点)

前言

本篇文章上一篇文章(传送门)。在上一篇文章,我们介绍了通过在C++中构建多执行输出引脚节点。本篇文章只是抛砖引玉,讲解如何实施异步节点构建,不代表实际产出必须按照此方案进行产出。

由于在蓝图中,如果希望编写异步节点,目前发现只有通过宏(这并不是逻辑单元),如果你有其他的办法,希望告诉我。

但是在C++中就完全可以完成,我们发现蓝图中有超多的异步节点(Delay,AIMoveTo,LoadStreamLevel FindSessions等),识别异步节点,只要看蓝图节点右上角是否存在时钟标记(图一)

图一

代码

首先在C++希望编写异步节点,最简单的方法是继承UBlueprintAsyncActionBase类(查阅上篇博客),我曾尝试自己继承UObject,但是无果,类关系应该是被引擎约定了,如果你知道原因,请告诉我。

头文件

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintAsyncNodePinResult, int32, Result);

/**
 * 
 */
UCLASS()
class UECPP_API UBlueprintAsyncNode : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

	UPROPERTY(BlueprintAssignable)
	FBlueprintAsyncNodePinResult OnSuccess;

	UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", Delay = "0.5"))
	static UBlueprintAsyncNode* AsyncDelay(UObject* WorldContextObject, float Delay);

protected:
	void TimeoutCallback();
};

源文件

// Fill out your copyright notice in the Description page of Project Settings.

#include "BlueprintAsyncNode.h"
#include <Engine/World.h>
#include <TimerManager.h>

UBlueprintAsyncNode* UBlueprintAsyncNode::AsyncDelay(UObject* WorldContextObject, float Delay)
{
	UBlueprintAsyncNode* Node = NewObject<UBlueprintAsyncNode>();
	//构建定时器
	FTimerHandle Handle;
	WorldContextObject->GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateUObject(Node, &UBlueprintAsyncNode::TimeoutCallback), Delay, false);
	return Node;
}

void UBlueprintAsyncNode::TimeoutCallback()
{
	if (OnSuccess.IsBound())
	{
		OnSuccess.Broadcast(10);
	}
}

这只是一个非常简单的定时任务异步逻辑,建议大家看看UBlueprintAsyncActionBase类,这个类是虚幻提供给我们进行构建异步节点的类。在UBlueprintAsyncActionBase提供了虚函数,并且提供了注释,大家可以阅读下,能够方便我们应对更多的开发场景需求。

祝大家在UE中玩的愉快!

版本V4.21.2

5 条评论

添加评论

您的电子邮箱地址不会被公开。