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

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


属性声明(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 
    // 不知道怎么用的,以后学会了再补充
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,196评论 6 13
  • 字符串资源 本地化过程的一个重要部分是本地化应用程序显示的所有文本字符串。根据其性质,位于nib文件中的字符串可以...
    nicedayCoco阅读 367评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,272评论 0 4
  • 事情发生在上世纪六十年代三年灾害期的某一年,具体时间不可考。 故事地点在陕西省关中地区下的古潼关,一个有名的关口,...
    亦如是阅读 325评论 0 0