概况

Gameplay类利用特殊标记,因此在继续之前,先来介绍一下虚幻属性系统的基础知识。UE4使用其自己的反射实现来支持动态功能,如垃圾回收、序列化、网络复制和蓝图/C++通信。这些功能是可选的,意味着您必须将正确的标记添加到类型,否则虚幻将忽略它们,而不会为它们生成反射数据。下面是对基本标记的简要概述:

  • UCLASS() - 用于告诉虚幻为结构体生成反射数据。类必须派生自UObject。
  • USTRUCT() - 用于告诉虚幻为结构体生成反射数据。
  • `GENERATED_BODY()** - UE4将这个标记替换为将为该类型生成的所有必要的样板代码。
  • UPROPERTY() - 支持将UCLASS的成员变量或USTRUCT用作UPROPERTY。UPROPERTY有很多用法。它可以允许复制变量、序列化变量和从蓝图访问变量。它们可以供垃圾回收程序使用,用来跟踪对 UObject 的引用次数。
  • UFUNCTION() - 支持将UCLASS的类方法或USTRUCT用作UFUNCTION。UFUNCTION可以允许从蓝图调用类方法,用作RPC等多种用途。

image.png

MyUobject代码示范

  1. #include "MyObject.generated.h"
  2. UCLASS(Blueprintable)
  3. class UMyObject : public UObject
  4. {
  5. GENERATED_BODY()
  6. public:
  7. MyUObject();
  8. UPROPERTY(BlueprintReadOnly, EditAnywhere)
  9. float ExampleProperty;
  10. UFUNCTION(BlueprintCallable)
  11. void ExampleFunction();
  12. };

首先我们会注意到包含了 MyClass.generated.h。UE4将生成所有反射数据并放入该文件中。我们必须将该文件作为声明类型的标头文件中的最后一个包含语句,将其包含进去。注意,MyClass.generated.h必须写在其他引用头文件之后,以免报错。
该示例中的 UCLASS、UPROPERTY 和 UFUNCTION 标记包含一些其他说明符。这些虽不是必需的,但为了演示目的,已经添加了一些常见说明符。这样我们可以指定特定行为或属性。

  • Blueprintable - 该类可以由蓝图扩展。
  • BlueprintReadOnly - 该属性可以从蓝图读取,但不能写入蓝图。
  • EditAnywhere - 该属性可以在原型和实例上的属性窗口中编辑。
  • Category - 定义该属性将出现在编辑器”细节(Details)”视图下面的哪个部分。这对于整理结构而言十分有用。
  • BlueprintCallable - 该功能可以从蓝图调用。

    更多参考

    说明符众多,不便在此一一列出,但可以参考下面的链接:
    UCLASS说明符列表
    UPROPERTY说明符列表
    UFUNCTION说明符列表
    USTRUCT说明符列表