目录 - Table of contents

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对应的结构体即可创建一个数据表。