2020年1月17日
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 条评论
想问一下博主,用的是UE4 什么 版本? 我同样的代码在UE4 4.21中 SetTimer 以及& 的部分会报错是怎么回事
方便提供报错内容么?版本4.21.2
请教&是什么 用的424改为FTimerDelegate::CreateUObject(Node,&UBlueprintAsyncAction::TimeoutCallback)
因为是web页面编辑器做输入,语法中个别会被修改~我调整下~
可以不适用创建代理对象方式进行参数填入,直接可以使用回调对象指针,加函数指针即可,如下
settime(handle, 回调对象指针,回调函数地址,定时)