前言

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

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

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

图一
图一

代码

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

头文件

c++
 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();
};

源文件

c++
 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