2.3 KiB
Raw Blame History

BlueprintAutocast

  • 功能描述: 告诉蓝图系统这个函数是用来支持从A类型到B类型的自动转换。
  • 使用位置: UFUNCTION
  • 引擎模块: Blueprint
  • 元数据类型: bool
  • 常用程度:

告诉蓝图系统这个函数是用来支持从A类型到B类型的自动转换。

所谓自动转换指的是从A类型的Pin拖拉到B类型的Pin时蓝图会在其中自动的生成类型转换节点。

这种转换函数必须是BlueprintPure因为其实是被动调用的不带主动执行节点。

测试代码:

USTRUCT(BlueprintType)
struct FAutoCastFrom
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	int32 X = 0;
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	int32 Y = 0;
};

USTRUCT(BlueprintType)
struct FAutoCastTo
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	int32 Sum = 0;
};

USTRUCT(BlueprintType)
struct FNoAutoCastTo
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	int32 Sum = 0;
};

UCLASS(Blueprintable, BlueprintType)
class INSIDER_API UMyFunction_AutoCast :public UBlueprintFunctionLibrary
{
public:
	GENERATED_BODY()
public:
	UFUNCTION(BlueprintPure, meta = (BlueprintAutocast))
	static FAutoCastTo Conv_MyTestAutoCast(const FAutoCastFrom& InValue);
};

//转换函数也经常配合CompactNodeTitle使用。
UFUNCTION(BlueprintPure, Category="Widget", meta = (CompactNodeTitle = "->", BlueprintAutocast))
static UMG_API FInputEvent GetInputEventFromKeyEvent(const FKeyEvent& Event);

示例效果:

支持自动转换的FAutoCastTo就在拖拉连线的时候就会自动生成节点而没有自动转换函数的FNoAutoCastTo就会产生报错。

Untitled

原理代码:

从这可以看出该函数必须是staticC++中的Public函数标上BlueprintPure拥有返回值且有一个输入参数。引擎里类型的自动转换关系是靠FAutocastFunctionMap来维护的。

static bool IsAutocastFunction(const UFunction* Function)
{
	const FName BlueprintAutocast(TEXT("BlueprintAutocast"));
	return Function
		&& Function->HasMetaData(BlueprintAutocast)
		&& Function->HasAllFunctionFlags(FUNC_Static | FUNC_Native | FUNC_Public | FUNC_BlueprintPure)
		&& Function->GetReturnProperty()
		&& GetFirstInputProperty(Function);
}