前言
在上一篇文章(传送门),我们介绍了通过在C++中构建多执行输出引脚节点。本篇文章只是抛砖引玉,讲解如何实施异步节点构建,不代表实际产出必须按照此方案进行产出。
由于在蓝图中,如果希望编写异步节点,目前发现只有通过宏(这并不是逻辑单元),如果你有其他的办法,希望告诉我。
但是在C++中就完全可以完成,我们发现蓝图中有超多的异步节点(Delay,AIMoveTo,LoadStreamLevel FindSessions等),识别异步节点,只要看蓝图节点右上角是否存在时钟标记(图一)
图一
代码
首先在C++希望编写异步节点,最简单的方法是继承UBlueprintAsyncActionBase类(查阅上篇博客),我曾尝试自己继承UObject,但是无果,类关系应该是被引擎约定了,如果你知道原因,请告诉我。
头文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// 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();
};
|
源文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 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