目录
简单的多流程制作
取消除流程外,原本的蓝图执行线【如果要进行异步执行可以不取消看效果】
结果
代码:
继承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();
}