本文是參考以下文檔結(jié)合個(gè)人實(shí)踐整理而成:
-
虛幻架構(gòu) - 屬性- 核心數(shù)據(jù)類型*
這小節(jié)有關(guān)數(shù)據(jù)類型的部分沒有中文翻譯,借此做個(gè)記錄。* - UE4 中的 C++ 編程介紹 - 數(shù)字類型、字符串、容器
屬性聲明(Property Declaration)
屬性變量使用標(biāo)準(zhǔn)C ++變量語(yǔ)法聲明,通過使用UPROPERTY宏來進(jìn)行屬性聲明標(biāo)記。
UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName;
核心數(shù)據(jù)類型(Core Data Types)
整型
因?yàn)椴煌脚_(tái)基礎(chǔ)類型的尺寸不同,如 short、int 和 long,UE4 提供了以下類型(即“int”或“uint”,后跟大小[以位為單位]),可用作替代品:
| 類型 | 描述 |
|---|---|
| uint8 | 8位無(wú)符號(hào) |
| uint16 | 16位無(wú)符號(hào) |
| uint32 | 32位無(wú)符號(hào) |
| uint64 | 64位無(wú)符號(hào) |
| int8 | 8位有符號(hào) |
| int16 | 16位有符號(hào) |
| int32 | 32位有符號(hào) |
| int64 | 64位有符號(hào) |
- 虛幻引擎擁有一個(gè)模板TNumericLimits,用于找到數(shù)值類型支持的最小和最大范圍。
- 請(qǐng)不要在可移植代碼中使用 C++ 整型,因?yàn)樾枰鶕?jù)編譯器決定這種數(shù)據(jù)類型的大小。
- 數(shù)值類型在NumericLimits.h中聲明,可以詳細(xì)閱讀查詢。
Bitmasks
整數(shù)類型的屬性可以作為位掩碼暴露給編輯器。
要將整數(shù)屬性標(biāo)記為位掩碼,只需向元素段添加“bitmask”,如下所示:
UPROPERTY(EditAnywhere, Meta = (Bitmask))
int32 BasicBits;
添加此元標(biāo)記后,編輯器中呈現(xiàn)的為通用命名標(biāo)志(“Flag1”,“Flag2”...“Flag32”)的下拉列表。
為了定制bitflags的名稱,我們必須首先使用“bitflags”元標(biāo)記創(chuàng)建一個(gè)UENUM:
UENUM(BlueprintType, Meta = (Bitflags))
enum class EColorBits
{
ECB_Red,
ECB_Green,
ECB_Blue
};
在創(chuàng)建這個(gè)UENUM之后,我們可以使用“BitmaskEnum”元標(biāo)簽來引用它,如下所示:
UPROPERTY(EditAnywhere, Meta = (Bitmask, BitmaskEnum = "EColorBits"))
int32 ColorFlags;
這樣調(diào)整后,下拉框中列出的位標(biāo)志將采用枚舉類條目的名稱和值。
在這個(gè)例子中,ECB_Red是值0,意味著當(dāng)選中時(shí)它將激活位0(向ColorFlags添加1);ECB_Green對(duì)應(yīng)于位1(將2加到ColorFlags);ECB_Blue對(duì)應(yīng)于位2(將4加到ColorFlags)。
- 雖然枚舉類型可以包含多于32個(gè)條目,但只有前32個(gè)值將在屬性編輯器UI中的位掩碼關(guān)聯(lián)中可見。
- 類似地,當(dāng)接受顯式值條目時(shí),具有不在0和31之間的顯式值的條目將不包括在下拉中。
浮點(diǎn)類型
虛幻使用標(biāo)準(zhǔn)的C ++浮點(diǎn)類型,float(32-bit)和double(64-bit)。
float num_f = 1.0f;
double num_d = 1.0;
Boolean型
布爾類型可以使用C ++ bool關(guān)鍵字或作為位域表示。
uint32 bIsHungry : 1;
bool bIsThirsty;
- 位域表示應(yīng)該是UE4里特有的,因?yàn)闆]有UPROPERTY標(biāo)記的話編譯會(huì)報(bào)錯(cuò)。
字符串
FString
FString 是一個(gè)可變字符串,類似于 std::string,它擁有許多方法,便于簡(jiǎn)單地使用字符串。
使用 TEXT() 宏可新建一個(gè) FString:
FString MyStr = TEXT("Hello, Unreal 4!").
FText
FText 與 FString 相似,但用于本地化文本。
使用 NSLOCTEXT 宏可新建一個(gè) FText,此宏擁有默認(rèn)語(yǔ)言的命名空間、鍵和一個(gè)數(shù)值。
FText MyText = NSLOCTEXT("Game UI", "Health Warning Message", "Low Health!")
也可使用 LOCTEXT 宏,只需要在每個(gè)文件上定義一次命名空間,確保在文件底層取消它的定義。
// 在 GameUI.cpp 中
#define LOCTEXT_NAMESPACE "Game UI"
//...
FText MyText = LOCTEXT("Health Warning Message", "Low Health!")
//...
#undef LOCTEXT_NAMESPACE
// 文件末端
FName
FName 將經(jīng)常反復(fù)出現(xiàn)的字符串保存為辨識(shí)符,以便在對(duì)比時(shí)節(jié)約內(nèi)存和 CPU 時(shí)間。
FName 不會(huì)在引用完整字符串的每個(gè)對(duì)象間對(duì)其進(jìn)行多次保存,而是使用一個(gè)映射到給定字符串的較小存儲(chǔ)空間 索引;這會(huì)單次保存字符串內(nèi)容,在字符串用于多個(gè)對(duì)象之間時(shí)節(jié)約內(nèi)存。
檢查 NameA.Index 是否等于 NameB.Index 可對(duì)兩個(gè)字符串進(jìn)行快速對(duì)比,避免對(duì)字符串中每個(gè)字符進(jìn)行相等性檢查。
編碼實(shí)踐
[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
// 應(yīng)該是UE4里特有的,沒有UPROPERTY標(biāo)記的話編譯會(huì)報(bào)錯(cuò)
UPROPERTY()
uint32 bSimGravityDisabled : 1;
#pragma endregion
[CoreDataTest.cpp]
// 寫了個(gè)方法來專門測(cè)試數(shù)據(jù)類型
// 這些數(shù)據(jù)類型應(yīng)該是通用的,不特針對(duì)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
// 不知道怎么用的,以后學(xué)會(huì)了再補(bǔ)充
}