UEC++宏
这些宏的作用就是通过反射把属性暴露在蓝图或实例的细节面板中,来实现C++和蓝图之间的通信和交互。简单来说,UE会生成它相关的反射数据,利用这些反射数据,我们可以在蓝图中找到相关的变量或方法。需要和各种说明符配合使用(详细见下文),每个宏大致的作用可查看:各个宏的介绍
例如:
UPROPERTY(VisibleAnywhere)
int32 VisibleAnywhereInt;
这样在这个UPROPERTY下的属性就是VisibleAnywhere的。
属性说明符
访问权限与可见性说明符
- VisibleAnywhere:实例中、类默认设置中以及蓝图编辑器中都可见,但不可编辑。
- VisibleDefaultsOnly:仅在类默认设置的细节面板中可见,在实例中及蓝图编辑器中的其他地方不可见,且不可编辑。
- VisibleInstanceOnly:仅在实例中可见,在类默认设置的细节面板中不可见,且不可编辑。
- EditAnywhere:可在细节面板中编辑,无论是在类默认设置还是实例中,同时在蓝图编辑器中也可编辑和访问。
- EditDefaultsOnly:仅在类默认设置中可通过细节面板编辑,在实例中不可编辑,但在蓝图中可以根据其读写属性进行访问。
- EditInstanceOnly:仅在实例中可编辑,在类默认设置中不可编辑,在蓝图中可见但通常不可修改,若与 BlueprintReadWrite 一起使用需谨慎,可能会失去仅在实例中可编辑的特性。
蓝图交互说明符
-
BlueprintReadOnly:此属性可以在蓝图中读取,但不能修改,适合用于一些常量或不希望在蓝图中被修改的属性。
-
BlueprintReadWrite:此属性允许在蓝图中被读或写,可在蓝图的图表中进行读写操作。
-
BlueprintCallable:暴露在蓝图中供调用。(有执行引脚,函数会在调用时执行一次,之后只是使用它的返回值)
-
UFUNCTION(BluprintCallable, Category = "MyFunction") void PrintF1();
-
-
BlueprintPure:纯函数,可以在蓝图中使用。(没有执行引脚,必须有函数返回值或者函数参数输出,会在每次需要使用返回值的时候执行一次)
-
UFUNCTION(BlueprintPure, Category = "MyFunction") void PrintF2();
-
-
BlueprintImplementableEvent:在C++中声明,不能定义,由蓝图重载实现(纯虚函数)
-
UFUNCTION(BlueprintImplementableEvent) void Test1();// 相当于一个事件 UFUNCTION(BlueprintImplementableEvent) int Test2();// 相当于一个函数 UFUNCTION(BlueprintImplementableEvent) void Test3(const FString& MyString);// 相当于一个有参数的事件 UFUNCTION(BlueprintImplementableEvent) void Test4(const FString& MyString);// 相当于一个有参数的函数
-
-
BlueprintNativeEvent:C++中实现,蓝图可重载或不重载
-
UFUNCTION(BlueprintNativeEvent) void TestA(); // 用这个说明符的,在实现的时候要加上_Implementation,否则会编译出错 // void AMyPawn::TestA_Implementation(){}
-
-
BlueprintType:将相关的数据暴露给蓝图使用。(将一个类或结构体标记为BlueprintType时,这个类或结构体的实例可以作为蓝图中的变量类型)
-
// 先在命名空间声明对枚举进行分组,提高代码的组织性和可读性 UENUM(BlueprintType) namespace MyEnumType { enum MyCustomEnum { Type1, Type2, Type3, }; } UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum") TEnumAsByte<MyEnumType::MyCustomEnum> MyCustomEnum;
-
分类说明符
-
Category:指定该属性类别的分类目录,用法为 Category = 类别名,可将属性进行分类,方便在编辑器中进行查找和管理。
-
// UPROPERTY()可以存在多种说明符,利用|表示子目录 UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = "MyIntValue") int32 Value1; UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = "MyIntValue|MySubIntValue") int32 Value2;
-
meta元数据说明符
-
DisplayName别名,这里创建的变量名,会被替换为别名
-
UPROPERTY(EditAnyWhere, BlueprintReadWrite, meta = (DisplayName = "MyValue3DisplayName")) int32 MyValue3
-
-
EditCondition条件控制编辑,可以使用一个bool值控制该变量的编辑
-
UPROPERTY(EditAnyWhere, BlueprintReadWrite, meta = (DisplayName = "Controller")) bool isController; UPROPERTY(EditAnyWhere, BlueprintReadWrite, meta = (EditCondition = "isController")) float Value3;
-
-
ToolTip解释说明符,用来解释说明我们的变量
-
UPROPERTY(EditAnyWhere, BlueprintReadWrite, meta = (ToolTip = "isControllerTrue")) bool isTrue;
-
-
ExposeOnSpawn蓝图生成时暴露
-
UPROPERTY(EditAnyWhere, BlueprintReadWrite, meta = (ExposeOnSpawn = "ExposeOnSpawnValue")) float MyHealth; // 蓝图生成时暴露该数据
-
UEC++结构体USTRUCT
USTRUCT(BlueprintType)
struct FMyTestStruct // 这里必须要以F开头来命名
{
GENERATED_USTRUCT_BODY() // 这个宏由UHT处理,用来自动生成一些引擎需要的底层实现
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestStruct")
int32 Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestStruct")
FString MyName;
};
结构体接收创建数据表格:
新建MyObject类,在MyObject.h中新建struct
USTRUCT(BlueprintType)
struct FMyTestStruct: public FTableRowBase // 继承该类
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
int32 Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
FString Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
int32 Level;
};
创建一个csv格式的表,拖入UE中Apply对应的结构体即可创建一个数据表。