三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

UE_C++ —— Structs

UE_C++ —— Structs

目录

一,实现一个UStruct

二,Struct Specifiers

三,最佳做法与技巧


结构体(Struct)是一种帮助组织和操作相关属性的数据结构;在引擎中,结构体会被引擎反射系统识别为UStruct,但不属于UObject生态圈,且不能在UClasses内部使用;

  • 在相同的数据布局下,UStructUObject能更快创建;

  • UStruct支持UProperty,但它不由垃圾回收系统管理,不能提供UFunction

一,实现一个UStruct

要把一个结构体变成UStruct,遵循以下步骤:

  • 打开要定义结构体的header (.h)文件;

  • USTRUCT宏放在结构体定义的上方;

  • GENERATED_BODY()宏作为定义的第一行;

USTRUCT([Specifier, Specifier, ...]) struct FStructName { GENERATED_BODY() };

注:可以用UPROPERTY来标记结构体的相关变量,使其在虚幻反射系统( Unreal Reflection System)和蓝图脚本(Blueprint Scripting)中可见;

二,Struct Specifiers

Atomic表示该结构体应始终被序列化为一个单元,不会为该类创建自动生成的代码,标头仅用于解析元数据;
BlueprintType将此结构体作为一种类型公开,可用于蓝图中的变量;
NoExport将不会为该类创建自动生成的代码,标头仅用于解析元数据;

三,最佳做法与技巧

  • UStruct可以使用引擎的智能指针(smart pointer)和垃圾回收系统以防止垃圾回收删除UObjects
  • 结构体最好用于简单数据类型,对于更复杂的交互,可使用UObjectAActor子类来代替;
  • UStructs不可以用于复制,但UProperty变量可以用于复制;
  • 引擎可自动为结构体创建Make和Break函数;
    • Make函数出现在任何带有BlueprintType标签的Ustruct中;
    • 如在UStruct中至少有一个BlueprintReadOnlyBlueprintReadWrite属性,Break函数就会出现;
    • Break函数创建的纯节点为每个标记为BlueprintReadOnlyBlueprintReadWrite的资产提供一个输出引脚;
← 返回列表