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

前言

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

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

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

图一

代码

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

头文件

 1// Fill out your copyright notice in the Description page of Project Settings.
 2 
 3#pragma once
 4 
 5#include "CoreMinimal.h"
 6#include "Kismet/BlueprintAsyncActionBase.h"
 7#include "BlueprintAsyncNode.generated.h"
 8 
 9DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintAsyncNodePinResult, int32, Result);
10 
11/**
12 * 
13 */
14UCLASS()
15class UECPP_API UBlueprintAsyncNode : public UBlueprintAsyncActionBase
16{
17    GENERATED_BODY()
18 
19    UPROPERTY(BlueprintAssignable)
20    FBlueprintAsyncNodePinResult OnSuccess;
21 
22    UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", Delay = "0.5"))
23    static UBlueprintAsyncNode* AsyncDelay(UObject* WorldContextObject, float Delay);
24 
25protected:
26    void TimeoutCallback();
27};

源文件

 1// Fill out your copyright notice in the Description page of Project Settings.
 2 
 3#include "BlueprintAsyncNode.h"
 4#include <Engine/World.h>
 5#include <TimerManager.h>
 6 
 7UBlueprintAsyncNode* UBlueprintAsyncNode::AsyncDelay(UObject* WorldContextObject, float Delay)
 8{
 9    UBlueprintAsyncNode* Node = NewObject<UBlueprintAsyncNode>();
10    //构建定时器
11    FTimerHandle Handle;
12    WorldContextObject->GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateUObject(Node, &UBlueprintAsyncNode::TimeoutCallback), Delay, false);
13    return Node;
14}
15 
16void UBlueprintAsyncNode::TimeoutCallback()
17{
18    if (OnSuccess.IsBound())
19    {
20        OnSuccess.Broadcast(10);
21    }
22}

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

祝大家在UE中玩的愉快!

版本V4.21.2

文章评论