【虛幻引擎】UE4虛擬架構(gòu)之屬性數(shù)據(jù)類型

本文是參考以下文檔結(jié)合個(gè)人實(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ǔ)充
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評(píng)論 19 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,496評(píng)論 6 13
  • 字符串資源 本地化過程的一個(gè)重要部分是本地化應(yīng)用程序顯示的所有文本字符串。根據(jù)其性質(zhì),位于nib文件中的字符串可以...
    nicedayCoco閱讀 393評(píng)論 0 0
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,689評(píng)論 0 4
  • 事情發(fā)生在上世紀(jì)六十年代三年災(zāi)害期的某一年,具體時(shí)間不可考。 故事地點(diǎn)在陜西省關(guān)中地區(qū)下的古潼關(guān),一個(gè)有名的關(guān)口,...
    亦如是閱讀 402評(píng)論 0 0

友情鏈接更多精彩內(nèi)容