【虚幻引擎】UE4虚拟架构之属性数据类型

本文是参考以下文档结合个人实践整理而成:

  • 虚幻架构 - 属性- 核心数据类型*
    这小节有关数据类型的部分没有中文翻译,借此做个记录。*
  • UE4 中的 C++ 编程介绍 - 数字类型、字符串、容器

属性声明(Property Declaration)

属性变量使用标准C ++变量语法声明,通过使用UPROPERTY宏来进行属性声明标记。

UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName;

核心数据类型(Core Data Types)

整型

因为不同平台基础类型的尺寸不同,如 short、int 和 long,UE4 提供了以下类型(即“int”或“uint”,后跟大小[以位为单位]),可用作替代品:

类型 描述
uint8 8位无符号
uint16 16位无符号
uint32 32位无符号
uint64 64位无符号
int8 8位有符号
int16 16位有符号
int32 32位有符号
int64 64位有符号
  • 虚幻引擎拥有一个模板TNumericLimits,用于找到数值类型支持的最小和最大范围。
  • 请不要在可移植代码中使用 C++ 整型,因为需要根据编译器决定这种数据类型的大小。
  • 数值类型在NumericLimits.h中声明,可以详细阅读查询。

Bitmasks

整数类型的属性可以作为位掩码暴露给编辑器。
要将整数属性标记为位掩码,只需向元素段添加“bitmask”,如下所示:

UPROPERTY(EditAnywhere, Meta = (Bitmask))
int32 BasicBits;

添加此元标记后,编辑器中呈现的为通用命名标志(“Flag1”,“Flag2”...“Flag32”)的下拉列表。



为了定制bitflags的名称,我们必须首先使用“bitflags”元标记创建一个UENUM:

UENUM(BlueprintType, Meta = (Bitflags))
enum class EColorBits
{
    ECB_Red,
    ECB_Green,
    ECB_Blue
};

在创建这个UENUM之后,我们可以使用“BitmaskEnum”元标签来引用它,如下所示:

UPROPERTY(EditAnywhere, Meta = (Bitmask, BitmaskEnum = "EColorBits"))
int32 ColorFlags;

这样调整后,下拉框中列出的位标志将采用枚举类条目的名称和值。
在这个例子中,ECB_Red是值0,意味着当选中时它将激活位0(向ColorFlags添加1);ECB_Green对应于位1(将2加到ColorFlags);ECB_Blue对应于位2(将4加到ColorFlags)。


  • 虽然枚举类型可以包含多于32个条目,但只有前32个值将在属性编辑器UI中的位掩码关联中可见。
  • 类似地,当接受显式值条目时,具有不在0和31之间的显式值的条目将不包括在下拉中。

浮点类型

虚幻使用标准的C ++浮点类型,float(32-bit)和double(64-bit)。

float num_f = 1.0f;
double num_d = 1.0;

Boolean型

布尔类型可以使用C ++ bool关键字或作为位域表示。

uint32 bIsHungry : 1;
bool bIsThirsty;
  • 位域表示应该是UE4里特有的,因为没有UPROPERTY标记的话编译会报错。

字符串

FString

FString 是一个可变字符串,类似于 std::string,它拥有许多方法,便于简单地使用字符串。
使用 TEXT() 宏可新建一个 FString:

FString MyStr = TEXT("Hello, Unreal 4!").

FText

FText 与 FString 相似,但用于本地化文本。
使用 NSLOCTEXT 宏可新建一个 FText,此宏拥有默认语言的命名空间、键和一个数值。

FText MyText = NSLOCTEXT("Game UI", "Health Warning Message", "Low Health!")

也可使用 LOCTEXT 宏,只需要在每个文件上定义一次命名空间,确保在文件底层取消它的定义。

// 在 GameUI.cpp 中
#define LOCTEXT_NAMESPACE "Game UI"

//...
FText MyText = LOCTEXT("Health Warning Message", "Low Health!")
//...

#undef LOCTEXT_NAMESPACE
// 文件末端

FName

FName 将经常反复出现的字符串保存为辨识符,以便在对比时节约内存和 CPU 时间。
FName 不会在引用完整字符串的每个对象间对其进行多次保存,而是使用一个映射到给定字符串的较小存储空间 索引;这会单次保存字符串内容,在字符串用于多个对象之间时节约内存。
检查 NameA.Index 是否等于 NameB.Index 可对两个字符串进行快速对比,避免对字符串中每个字符进行相等性检查。

编码实践

[CoreDataTest.h]
void TestData();

#pragma region  Test bitmask
    UPROPERTY(EditAnywhere, Meta = (Bitmask))
        int32 BasicBits;
    UPROPERTY(EditAnywhere, Meta = (Bitmask, BitmaskEnum = "EColorBits"))
        int32 ColorFlags;
#pragma endregion

#pragma region Boolean
    // 应该是UE4里特有的,没有UPROPERTY标记的话编译会报错
    UPROPERTY()
        uint32 bSimGravityDisabled : 1;
#pragma endregion   

[CoreDataTest.cpp]
// 写了个方法来专门测试数据类型
// 这些数据类型应该是通用的,不特针对UPROPERTY
void ACoreDataTest::TestData()
{
    // Integers
    uint8 num_u8 = 8;
    uint16 num_u16 = -16;
    uint32 num_u32 = 32;
    uint64 num_u64 = 64;

    int8 num_i8 = 8;
    int16 num_i16 = 16;
    int32 num_i32 = 32;
    int64 num_i64 = 64;

    // Float
    float num_f = 1.0f;
    double num_d = 1.0;

    // Boolean
    bool bIsThirsty = false;

    //String
    FString fstr = TEXT("Hello, UrealEngine 4!");
    FText ftext_ns = NSLOCTEXT("Game UI", "Health Waring Message", "Low Health!");

#define LOCTEXT_NAMESPACE "Game UI"
    FText ftext = LOCTEXT("Health Warning Message", "Low Health");
#undef LOCTEXT_NAMESPACE

    // FName 
    // 不知道怎么用的,以后学会了再补充
}

你可能感兴趣的:(【虚幻引擎】UE4虚拟架构之属性数据类型)