【转载】UE4 [C++] UEnum 枚举相关使用

1,489 阅读2分钟

原文链接

我对原文的格式进行了一些调整并高亮了一些重点,以便阅读 以下为正文

大家好,我是刘茗

enum class

在 C++11 标准中,除了传统的枚举 enum 关键字之外, 还新增了一个概念: enum class

enum class 组合具有 class 封装性的特性,作用域是确定的

在 UE4 中声明枚举有两种方式

// 第一种
UENUM()
namespace EWeapon
{
    enum Type
    {
        EW_Handgun,
        EW_shotgun
    };
}

// 第二种
UENUM()
enum class EWeapon : uint8
{
	EW_Handgun,
	EW_shotgun
};

对于枚举中的元素,我们可以使用 UMETA 来对它进行修饰。

必须添加 BlueprintType 标识 如果想要显示中文,需要设置编码格式为 UTF-8

// 必须添加 BlueprintType 标识
UENUM(BlueprintType)
enum class EWeapon : uint8
{
	EW_Handgun        UMETA(DisplayName="Handgun"), // 如果想要显示中文,需要设置编码格式为 UTF-8
	EW_shotgun        UMETA(DisplayName="shotgun"),
};

如果枚举索引不想从 0 开始的话,使用下面的格式:

UENUM(BlueprintType)
enum class EWeapon : uint8
{
	EW_Handgun = 1        UMETA(DisplayName="Handgun"),
	EW_shotgun            UMETA(DisplayName="shotgun"),
};

枚举指针的获取:

const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("EWeapon"), true);

UEnum 继承自 UField

实用函数

  • 通过名字获取索引
int32 GetIndexByName(FName InName, EGetByNameFlags Flags = EGetByNameFlags::None) const;
  • 通过索引获取名字
FName GetNameByIndex(int32 Index) const;
  • 通过值获取索引下标
FORCEINLINE int32 GetIndexByValue(int64 InValue) const
  • 通过下标获取
FORCEINLINE int64 GetValueByIndex(int32 Index) const
  • 通过下标获取显示名称
virtual FText GetDisplayNameTextByIndex(int32 InIndex) const;
  • 获取索引最大值
int64 GetMaxEnumValue() const;

检查索引是否有效,加强代码稳定性

/** 检查 enum 是否有给定值的条目。 包括自动生成的 _MAX 条目。 */
bool IsValidEnumValue(int64 InValue) const;

/** 检查 enum 是否有给定名称的条目。 包括自动生成的 _MAX 条目。 */
bool IsValidEnumName(FName InName) const;

后续待补充 ……

本篇较基础,希望能在 UE4 的 C++ 开发上帮大家入门,感谢大家的支持!