本文是参考以下文档结合个人实践整理而成:
- 虚幻架构 - 属性- 核心数据类型*
这小节有关数据类型的部分没有中文翻译,借此做个记录。* - 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
// 不知道怎么用的,以后学会了再补充
}