87 lines
4.0 KiB
Markdown
Raw Normal View History

2024-10-12 17:19:46 +08:00
# ExpandEnumAsExecs
- **功能描述:** 指定多个enum或bool类型的函数参数自动根据条目生成相应的多个输入或输出执行引脚并根据实参值不同来相应改变控制流。
- **使用位置:** UFUNCTION
- **引擎模块:** Blueprint
- **元数据类型:** strings="abc"
- **关联项:** [ExpandBoolAsExecs](../ExpandBoolAsExecs.md)
- **常用程度:** ★★★★★
指定多个enum或bool类型的函数参数自动根据条目生成相应的多个输入或输出执行引脚并根据实参值不同来相应改变控制流。
支持改变输入和输出的Exec输入Exec只可以一个但是输出ExecEnum Pin可以多个。但是不能用在BlueprintPure上都没Exec引脚了
也可以通过‘|’来分隔。
支持3种参数类型enum classTEnumAsByte<EMyExecPins2::Type>和booleunum必须用UENUM标记。
引用类型的参数和返回值用作输出Pin值类型的参数用作输入Pin。
可以用“ReturnValue”这个名字来指定使用返回值参数。
如果有多个输出Enum参数会在函数的调用之后排成Sequecene来一一分别根据输出Enum的值来触发输出Exec。
## 测试代码:
```cpp
UENUM(BlueprintType)
enum class EMyExecPins : uint8
{
First,
Second,
Third,
};
UENUM(BlueprintType)
namespace EMyExecPins2
{
enum Type : int
{
Found,
NotFound,
};
}
UENUM(BlueprintType)
enum class EMyExecAnimalPins : uint8
{
Cat,
Dog,
};
public:
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Pins"))
static int32 MyEnumAsExec_Output(FString Name, EMyExecPins& Pins) { return 0; }
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Pins"))
static int32 MyEnumAsExec_Input(FString Name, TEnumAsByte<EMyExecPins2::Type> Pins) { return 0; }
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "ReturnValue"))
static EMyExecPins MyEnumAsExec_Return(FString Name) { return EMyExecPins::First; }
public:
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Pins"))
static int32 MyBoolAsExec_Output(FString Name, bool& Pins) { return 0; }
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "Pins"))
static int32 MyBoolAsExec_Input(FString Name, bool Pins) { return 0; }
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "ReturnValue"))
static bool MyBoolAsExec_Return(FString Name) { return false; }
public:
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "InPins,OutAnimal|OutPins|ReturnValue"))
static bool MyEnumAsExec_MultipleOut(FString Name, EMyExecPins InPins, EMyExecAnimalPins& OutAnimal, TEnumAsByte<EMyExecPins2::Type>& OutPins, FString& Result);
```
## 蓝图效果:
可以对照上述上述的函数原型和蓝图节点可以发现ExpandEnumAsExecs执行3种参数类型。同时也验证了在同时拥有多个输出Enum参数的时候(代码里是OutAnimal|OutPins|ReturnValue)会按顺序执行3次输出就像用Sequence节点连接在了一起一样。
![Untitled](Untitled.png)
## 原理:
真正的创建Pin是在void UK2Node_CallFunction::CreateExecPinsForFunctionCall(const UFunction* Function)然后这些新的ExecPin和配套的赋值输入参数值以及根据输出参数执行不同输出ExecPin的逻辑在UK2Node_CallFunction::ExpandNode中。代码太多就不贴出来了。
是如何控制Exec流向的在函数的实现里只要把相应的引用输出参数赋值就自然会流向不同的Pin。这部分逻辑是在UK2Node_CallFunction::ExpandNode中实现。大概逻辑是针对Input引脚会在中间插入UK2Node_AssignmentStatement执行不同输入Pin会相应的设置输入enum参数的的值。而针对Output引脚会在中间插入UK2Node_SwitchEnum这样当我们在函数中设置引用输出enum参数的值后就可以根据enum的值流向相应的不同输出Pin节点。而对bool参数也会创建相应的中间蓝图节点来获取和设置bool参数。
函数原始的参数Pin会被隐藏起来从而只暴露生成后的Exec Pin。