UE4入门-常见的宏-UCLASS

时间:2024-11-14 08:16:06

**UCLASS 宏为 UObject 提供一个对 UCLASS 的引用,描述其基于虚幻引擎的类型。**每个 UCLASS 保留一个称作“类默认对象(Class Default Object)”的对象,简称 CDO。CDO 本质上是一个默认“模板”对象,由类构建函数生成,之后并未进行修改。UCLASS 和 CDO 均可为特定对象实例恢复,但它们通常为只读。使用 GetClass() 函数即可随时访问对象实例的 UCLASS

UCLASS 包含定义类的一套属性和函数。这些是本地代码可用的普通 C++ 函数和变量,但被虚幻引擎特有的元数据所标记,它们在对象系统中的行为也因此受到控制

需要注意 UObject 类还可包括仅限本地的属性,这些属性不存在于相应的 UCLASS 中


游戏性类

虚幻引擎中每个游戏类由一个类头文件 .h 和一个类源文件 .cpp 构成。类头包含类和类成员(如变量和函数)的声明,而在类源文件中通过实现属于类的函数来定义类的功能

游戏性类的类头文件使用标准C++语法,并结合专门的宏,以简化类、变量和函数的声明过程

在每个游戏性类头文件的顶端,需要包含生成的头文件(自动创建),因此在 的顶端不许出现 #include ""


类声明

类声明定义类的名称、其继承的类,以及其继承的函数和变量。类声明还将定义通过 类说明符元数据 要求的其他引擎和编辑器特定行为

类声明的语法如下所示

UCLASS([specifier, specifier, …], [meta(key=value, key=value, …)])
class ClassName : public ParentName
{
GENERATED_BODY()
}

<font color=blue>
声明包含一个类的标准C++类声明。在标准声明之上,描述符(如类说明符合元数据)将被传递到 `UCLASS` 宏。它们用于创建被声明类的 `UClass` ,它可被看作引擎对类的专有表达。此外, `GENERATED_BODY()` 宏必须被放置在类体的最前方
</font>

类说明符

在声明类时,声明上可添加修饰符以控制引擎和编辑器的不同方面的类表现

  • Abstract
    抽象类说明符将类声明为 “抽象基类”, 防止用户在虚幻编辑器中向世界添加此类的参与者, 或在游戏中创建此类的实例。这对于那些本身没有意义的类很有用。例如, ATriggerBase 基类是抽象的, 而 ATriggerBox 子类别不是抽象的, 您可以在世界上放置一个 ATriggerBox 类的实例, 并且它是有用的, 而 ATriggerBase 的实例本身并不有用

  • AdvancedClassDisplay
    AdvancedClassDisplay 类说明符强制类的所有属性只显示在 “详细信息” 面板的 “高级” 部分中, 默认情况下隐藏在 “视图” 中。若要在单个属性上重写此项, 请在该属性上使用 SimpleDisplay 说明符

  • AutoCollapseCategories=(Category1, Category2, …) / DontAutoCollapseCategories=(Category, Category, …)
    AutoCollapseCategories类说明符取消对父类AutoExpandCategories说明符的列出类别的影响
    DontAutoCollapseCategories否定从父类继承的列出类别的AutoCollapseCategories说明符

  • AutoExpandCategories=(Category1, Category2, …)
    指定应在该类的对象的 “虚幻编辑器” 属性窗口中自动展开的一个或多个类别。若要自动声明为无类别的变量, 请使用声明变量的类的名称

  • Blueprintable / NotBlueprintable
    将此类公开为创建蓝图的可接受基类。默认是NotBlueprintable,除非继承,否则该说明符由子类继承

  • BlueprintType
    将此类公开为可用于蓝图中的变量的类型

  • ClassGroup=GroupName
    表示在Actor浏览器中启用Group View后,虚幻编辑器的Actor浏览器应该在指定的GroupName中包含此类以及此类的任何子类

  • CollapseCategories / DontCollapseCategories
    表示不应将此类的属性分组到虚幻编辑器属性窗口中的类别中。这个说明符被传播给子类;但是,子类可以使用DontCollapseCategories说明符来覆盖它

  • Config=ConfigName
    表示允许此类在配置文件 (. ini) 中存储数据。如果有使用 config 或 globalconfig 说明符声明的任何类属性, 则此指定符将导致这些属性存储在命名的配置文件中。此说明符被传播到所有子类, 不能被否定, 但是子类可以通过 re-declaring 配置说明符并提供不同的 ConfigName 来更改配置文件。常见的 ConfigName 值是 “Engine”、“Editor”、“Input” 和 “Game”

  • Const
    该类中的所有属性和函数都是const的,并以const的形式导出。该说明符由子类继承

  • ConversionRoot
    Root转换将一个子类限制为仅能够转换为第一个Root类的子类,并上升到层次结构

  • CustomConstructor
    阻止自动生成构造函数声明

  • DefaultToInstanced
    这个类的所有实例都被认为是“实例化”的。实例化的类(组件)在构建时被复制。该说明符由子类继承

  • DependsOn=(ClassName1, ClassName2, …)
    列出的所有类将在该类之前编译。类必须在同一个 (或上一个) 包中指定一个类。可以使用由逗号分隔的单个取决于行指定多个依赖项类, 也可以为每个类使用单独的取决于行指定。当类使用在另一个类中声明的结构或枚举时, 这一点很重要, 因为编译器只知道它已编译的类中的内容

  • Deprecated
    这个类不推荐使用,而且这个类的对象在序列化的时候不会被保存。该说明符由子类继承

  • EditInlineNew / NotEditInlineNew
    表示可以从 “虚幻编辑器” 属性窗口创建此类的对象, 而不是从现有资产引用。默认行为是只有对现有对象的引用才可以通过属性窗口分配。此说明符被传播到所有子类;子类可以使用 NotEditInlineNew 说明符来重写此说明符

  • HideCategories=(Category1, Category2, …) / ShowCategories=(Category1, Category2, …)

    • HideCategories列出应隐藏在此类对象的 “虚幻编辑器” 属性窗口中的一个或多个类别。若要隐藏声明为 “no” 类别的属性, 请使用声明该变量的类的名称。此说明符被传播到子类
    • ShowCategories为所列出的类别取消一个HideCategories说明符(从基类继承)
  • HideDropdown
    防止在虚幻编辑器属性窗口组合框中显示此类

  • HideFunctions=(Category1, Category2, …)/ ShowFunctions=(Category1, Category2, …)

    • HideFunctions从属性查看器隐藏指定类别中的所有函数
    • ShowFunctions在属性查看器中显示列出的类别中的所有功能
  • HideFunctions=FunctionName**/ ShowFunctions**=FunctionName

    • HideFunctions隐藏属性查看器中的指定名称的函数
    • ShowFunctions显示属性查看器中的指定名称的函数
  • Intrinsic
    这表明这个类是直接用C ++声明的,并且没有虚幻头文件工具生成的样板文件。不要在新类上使用这个说明符

  • MinimalAPI
    仅导致要导出的类的类型信息供其他模块使用。类可以被强制转换, 但不能调用类的函数 (内联方法除外)。这提高了编译时间, 因为不为不需要在其他模块中访问所有函数的类导出所有内容

  • NoExport
    表示此类的声明不应包含在由标头生成器自动生成的 c++ 头文件中。必须在单独的头文件中手动定义 c++ 类声明。仅对本机类有效。不要将此用于新类

  • Placeable / NotPlaceable
    表示可以在编辑器中创建此类, 并将其置于关卡、UI 场景或蓝图中 (具体取决于类类型)。此标志将传播到所有子类;子类可以使用 NotPlaceable 说明符来重写此标志

  • Transient / NonTransient
    属于此类的对象将永远不会保存到磁盘。这与某些非永久性的自然类 (如播放器或窗口) 结合使用非常有用。此说明符被传播到子类, 但可以由 NonTransient 说明符重写

  • Within=OuterClassName
    这个类的对象不能存在于一个OuterClassName对象的实例之外。这意味着创建这个类的Object需要提供一个OuterClassName的实例作为其外部对象


元数据修饰符

对元数据修饰符的使用按常规类、函数和接口修饰符而不同

  • BlueprintSpawnableComponent
    如果存在, 组件类可以由蓝图生成

  • BlueprintThreadSafe
    仅对蓝图函数库有效。此说明符将此类中的函数标记为在动画蓝图中的游戏线程上可调用

  • ChildCannnotTick / ChildCanTick

    • ChildCannnotTick用于Actor和Component类。如果本机类不能勾选, 基于此Actor或Component的蓝图生成的类将永远不会勾选, 即使 bCanBlueprintsTickByDefault 为true
    • ChildCanTick用于Actor和Component类。如果本机类不能勾选, 则基于此参与者或组件的蓝图生成的类可以覆盖 bCanEverTick 标志, 即使 bCanBlueprintsTickByDefault 是 false
  • DeprecatedNode
    对于行为树节点, 指示该类已弃用, 并在编译时显示警告

  • DeprecationMessage=“Message Text”
    如果该类被弃用, 则在尝试编译使用它的蓝图时, 此消息将被添加到标准弃警告中

  • DisplayName=“Blueprint Node Name”
    蓝图中此节点的名称将替换为此处提供的值, 而不是代码生成的名称

  • DontUseGenericSpaenObject
    不要在蓝图中使用泛型创建对象节点生成类的对象。此说明符仅对既非参与者也不 ActorComponents 的 BluprintType 类是有意义的

  • ExposedAsyncProxy
    在异步任务节点中公开此类的代理对象

  • IgnoreCategoryKeywordsInSubclasses
    用于使类的第一个子类忽略所有继承的 ShowCategories 和 HideCategories 说明符

  • IsBlueprintBase=“true / false”
    声明此类是 (或不是) 用于创建蓝图的可接受基类, 类似于 UCLASS 说明符、Blueprintable 或 “NotBlueprintable”

  • KismetHideOverrides=“Event1, Event2, …”
    不允许重写的蓝图事件列表

  • ProhibitedInterfaces=“Interface1, Interface2, …”
    列出与类不兼容的接口

  • RestrictedToClasses=“Class1, Class2, …”
    由蓝图函数库类使用, 用于限制列表中命名的类的用法

  • ShortToolTip
    在某些上下文中使用的简短工具提示, 其中完整的工具提示可能是压倒性的, 如父类选择器对话框

  • ToolTip
    重写代码注释中自动生成的工具提示

  • ShowWorldContextPin
    表示放置在此类所拥有的关系图中的蓝图节点必须显示它们的世界上下文针脚, 即使它们通常是隐藏的, 因为此类的对象不能用作世界上下文

  • UsesHierarchy
    表示类使用分层数据。用于实例化详细信息面板中的分层编辑功能