【虚幻引擎】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 
    // 不知道怎么用的,以后学会了再补充
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

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