UE4/5c++基于BlueprintAsyncActionBase和FTickableGameObject的异步节点【多流程的创建、异步执行】

目录

简单的多流程制作

取消除流程外,原本的蓝图执行线【如果要进行异步执行可以不取消看效果】

结果

代码:

继承FTickableGameObject,时刻判断是否结束,来执行不同引脚

结果:

代码:


在之前笔者讲解了通过枚举的方式去制作“因为某原因执行不同情况的执行线” 的节点,以及多个引脚的输入和输出的相关文章:

UE4/5c++如何创建有多个输出执行的函数(不同情况不同执行线)_ue4 同时执行_多方通行8的博客-CSDN博客

UE4/5c++如何创建有多个输出变量(引脚)的函数_c++函数输出多个变量_多方通行8的博客-CSDN博客

简单的多流程制作

首先笔者将讲解不同流程是如何制作的:

首先是继承于BlueprintAsyncActionBase类,做一个多播,如果不理解什么是多播可以看:

UE4/5C++:Delegate(委托or代理?)的使用_c++代理和委托_多方通行8的博客-CSDN博客

之后我们做一个函数,这个函数的作用是输入值,并修改内部的值,为的是更好的为我们使用virtual void Activate() override;

取消除流程外,原本的蓝图执行线【如果要进行异步执行可以不取消看效果】

在UCLASS写上:UCLASS(meta = (HideThen = true))

结果

这里随便创建一个actor类:

写完后,我们会获得两种函数,上面的就是通过 virtual void Activate() override;的多流程函数,虽然上面加入了时间,但你如果没有写,实际上是不会发生等待之类的。

代码:

头文件


#pragma once

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


DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyBAADelegate, int, Ret);


/**
 * 
 */
UCLASS(meta = (HideThen = true))
class METAHUMANTEST_API UMyBAA : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()
public:

	UPROPERTY(BlueprintAssignable)
		FMyBAADelegate yes;
	UPROPERTY(BlueprintAssignable)
		FMyBAADelegate no;
	//暴露给蓝图
	UFUNCTION(BlueprintCallable, Category = "DelayAction")
	static UMyBAA* JudeNum(int waitTime);
protected:
	// 继承自父类的虚函数
	virtual void Activate() override;

private:
	UPROPERTY(EditAnywhere)
		float DelayTime;
};

cpp文件:

#include "MyBAA.h"

UMyBAA* UMyBAA::JudeNum(int waitTime)
{
	// 创建UMyBAA对象
	UMyBAA* DelayAction = NewObject<UMyBAA>();
	DelayAction->DelayTime = waitTime;
	//返回
	return DelayAction;
}

void UMyBAA::Activate()
{
	if (DelayTime <5)
	{
		DelayTime++;
		yes.Broadcast(DelayTime);
	}
	else
	{
		no.Broadcast(DelayTime);
	}
}

继承FTickableGameObject,时刻判断是否结束,来执行不同引脚

在原来的基础上,我们再基础一个FTickableGameObject类【这里可以把原来的Activate的逻辑可以去除掉了,虽然只执行一次,但是可能会和tick中的逻辑发生冲突,需要自己去进行判断

其实就是多写几行代码,值得注意的是tick的接口和头文件的加入,这个函数可以时时刻刻通过tick来判断数值是否【这里我将UCLASS中的meta = (HideThen = true)去掉了

结果:

代码:

头文件

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

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "Tickable.h"

#include "MyBAA.generated.h"


DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyBAADelegate, int, Ret);


/**
 * 
 */
UCLASS(/*meta = (HideThen = true)*/)
class METAHUMANTEST_API UMyBAA : public UBlueprintAsyncActionBase,public FTickableGameObject
{
	GENERATED_BODY()
public:

	UPROPERTY(BlueprintAssignable)
		FMyBAADelegate yes;
	UPROPERTY(BlueprintAssignable)
		FMyBAADelegate no;


	UFUNCTION(BlueprintCallable, Category = "DelayAction")
	static UMyBAA* JudeNum(int waitTime);
protected:
	// 继承自父类的虚函数
	virtual void Activate() override;
	// tick接口
	virtual void Tick(float DeltaTime);
	virtual TStatId GetStatId() const;
private:
	UPROPERTY(EditAnywhere)
		float DelayTime;
};

cpp文件:

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


#include "MyBAA.h"

UMyBAA* UMyBAA::JudeNum(int waitTime)
{
	// 创建UMyBAA对象
	UMyBAA* DelayAction = NewObject<UMyBAA>();
	DelayAction->DelayTime = waitTime;
	//返回
	return DelayAction;
}

void UMyBAA::Activate()
{
	//if (DelayTime <5)
	//{
	//	DelayTime++;
	//	yes.Broadcast(DelayTime);
	//}
	//else
	//{
	//	no.Broadcast(DelayTime);
	//}
}

void UMyBAA::Tick(float DeltaTime)
{
	if (DelayTime > 0)
	{
		DelayTime--;
		yes.Broadcast(DelayTime);
		if (DelayTime == 0)
		{
			no.Broadcast(DelayTime);
			RemoveFromRoot();
		}
	}
}

TStatId UMyBAA::GetStatId() const
{
	return TStatId();
}


猜你喜欢

转载自blog.csdn.net/q244645787/article/details/131695390
今日推荐