虚幻 – 自定义 USTRUCT 结构体的 Make&Break 函数

假设我们有一个带 USTRUCT 宏的结构体,我们希望在蓝图中可以以自己的方式 Make 或者 Break ,这个需求通常是因为我们在结构体里用了 C++ 中不支持反射的成员。

USTRUCT(BlueprintType, Meta = (HasNativeMake, HasNativeBreak))
struct FMeshVertex
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)
    FVector Position;

    UPROPERTY(EditAnywhere)
    FVector TangentX;

    UPROPERTY(EditAnywhere)
    FVector TangentY;

    UPROPERTY(EditAnywhere)
    FVector TangentZ;

    UPROPERTY(EditAnywhere)
    FVector2D UVs[8];

    UPROPERTY(EditAnywhere)
    FColor Color;
};

例如在上面这个结构体中, UVs 成员是一个原生定长 C 数组,这时候传统的 Make&Break 就无法访问到该成员了,需要我们使用原生自定义 Make&Break 函数。

USTRUCT(BlueprintType, Meta = (HasNativeMake, HasNativeBreak))

通过在 USTRUCT 宏的 Meta 元数据中加入 HasNativeMake&HasNativeBreak 标记,可以让反射系统晓得我们希望使用自定义的 Make&Break 函数,而不是系统生成的函数,这样我们就可以在 UBlueprintFunctionLibrary 中自定义 Make&Break 函数了。

UCLASS(Meta = (BlueprintThreadSafe))
class UMeshVertexBlueprintLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

public:

    UFUNCTION(BlueprintPure, Meta = (NativeMakeFunc, AutoCreateRefTerm = "Position, TangentX, TangentY, TangentZ, UV0,  UV1, UV2, UV3, UV4, UV5, UV6, UV7, Color", AdvancedDisplay = "TangentX, TangentY, UV1, UV2, UV3, UV4, UV5, UV6, UV7"))
    static FMeshVertex MakeMeshVertex(const FVector& Position, const FVector& TangentX, const FVector& TangentY, const FVector& TangentZ, const FVector2D& UV0, const FVector2D& UV1, const FVector2D& UV2, const FVector2D& UV3, const FVector2D& UV4, const FVector2D& UV5, const FVector2D& UV6, const FVector2D& UV7, const FLinearColor& Color);

    UFUNCTION(BlueprintPure, Meta = (NativeBreakFunc, AdvancedDisplay = "TangentX, TangentY, UV1, UV2, UV3, UV4, UV5, UV6, UV7"))
    static void BreakMeshVertex(const FMeshVertex& InVertex, FVector& Position, FVector& TangentX, FVector& TangentY, FVector& TangentZ, FVector2D& UV0, FVector2D& UV1, FVector2D& UV2, FVector2D& UV3, FVector2D& UV4, FVector2D& UV5, FVector2D& UV6, FVector2D& UV7, FLinearColor& Color);

};

自定义的 Make&Break 函数需要使用 NativeMakeFunc&NativeBreakFunc 元数据进行标记这样可以改变函数在蓝图中的外观,使其和默认 Make&Break 拥有相同的节点外观。


  • BlueprintType – 表示结构蓝图可用
  • HasNativeMake – 结构体拥有原生自定义 Make 函数
  • HasNativeBreak – 结构体拥有原生自定义 Break 函数
  • NativeMakeFunc – 标记函数是某个结构体的原生自定义 Make 函数
  • NativeBreakFunc – 标记函数是某个结构体的原生自定义 Break 函数
  • BlueprintThreadSafe – 线程安全的 可以在动画蓝图等多线程蓝图中使用
  • BlueprintPure – 函数是蓝图纯的 无执行流引脚 同时表示执行次数和时机不定
  • AutoCreateRefTerm – 自动创建引用 蓝图中可缺省该参数 const& 参数将像按值传参一样表现
  • AdvancedDisplay – 标记为高级参数 默认折叠 需要点击节点下方小三角展开

发表回复