UHT 为 Enum 生成的代码
在 UE 中,当我们声明一个枚举类型时可以像 UClass 一样地形式为其添加 UENUM
标记,指导 UHT 为其生成反射代码:
1 | UENUM(BlueprintType) |
经过 UHT 之后就变成了:
1 | // generated.h |
1 | // .gen.cpp |
UEnum 的构造思路和 UClass 差不多,通过 UHT 生成 Enum 的反射代码,记录枚举类型的名字、枚举值的名字、元数据等等,通过 UE4CodeGen_Private::ConstructUEnum
把这些反射数据构造出 UEnum。
同样也是通过 延迟注册 的方式把 UEnum 构造出来。
运行时访问 UEnum
如果要获取一个 UENMU
的 UEnum* 可以通过 StaticEnum<ETypeName>()
或者通过 UEnum* const MethodEnum = FindObjectChecked<UEnum>(ANY_PACKAGE, TEXT("ETypeName"), true);
来拿。
在 UE4.22+ 的版本中可以使用下列方法:
1 | const UEnum* TypeEnum = StaticEnum<EnumType>(); |
在 4.21 及之前的版本就要麻烦一点:
1 | const UEnum* TypeEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("EnumType"), true); |
注意上面的 TEXT("EnumType")
其中要填想要获取的枚举类型名字。
根据枚举名字获取枚举值
1 | // get enum value by name |
如果也想再封装一层模板类,让枚举名字也可以自动获取,则需要用得到 C++ 的 RTTI 特性:
1 | template<typename T> |
枚举值与字符串的互相转换
有些需要序列化枚举值的需要,虽然我们可以通过 FindObject<UEnum>
传入枚举名字拿到 UEnum*
,再通过GetNameByValue
拿到名字,但是这样需要针对每个枚举都要单独写,我写了模板函数来做这个事情:
1 | // 同时支持 4.21- 和 4.21+ 版本引擎 |
以及从字符串获取枚举值:
1 | template<typename ENUM_TYPE> |