在下接觸UE不久,一開始遇到這個FString str = TEXT("Hello");表示有點懵逼,為啥每次聲明一個所謂的字符串類型都需要,而且,UE中幾乎很少使用std::string = "hello",這是為何吶。
有FString,FName,FText,這里,就講一下,為何會有這些。
1.來歷
UE4有三個常用的字符串類,FName,FText,FString,為啥吶,一句話,因為游戲對於性能的要求是很高的,普通的string滿足不了UE游戲開發性能需求,所以,FString,FName,FText出現,為了解決不同的游戲開發需求,適應不同情況下字符串的要求。
2.區別
FName,給某個東西命名的,FName不區分大小寫,為便於快速定位某個資源,std:string里會直接比較字符串內容,時間復雜度最壞情況為O(m*n),FName當創建時,會根據字符串內容計算出一個Hash值,這樣實現比較邏輯的時候不用比較字符串內容,而是直接比較hash值是否相等,就是O(1). 注意:FName 不區分大小寫
FText,相對FName,FText有點重, 看到的文本,都是FText,可以用於多語言功能。
FString最接近std:string,不同於前面兩種,他創建后是可修改的。提供了大量操作字符串的方法。性能差。FString 本質上是一個地址類型。
3.轉換規則
TestString = TestName.ToString();
TestString = TestText.ToString();
TestName = FName(*TestString);
TestName = TestText !!! 從FText到FName轉換不存在,但是可以通過先轉到FString,再轉到FName,但是不可靠,因為FName不區分大小寫。
TestText = FText::FromName(TestName)
TestText = FText::FromString(TestString)
綜上
4.Text宏
為何FString str = TEXT("Hello");
如果未使用TEXT()宏,將使用ANSI對文字進行編碼,會導致支持字符高度受限(簡單來說,會亂碼)。傳入FString的ANSI文字需要完成到TChar的轉換
5.參考
https://blog.csdn.net/weixin_43405546/article/details/95978408
https://answers.unrealengine.com/questions/90638/text-string-or-name.html
https://docs.unrealengine.com/zh-CN/Programming/UnrealArchitecture/StringHandling/index.html