Unreal TEXT FText,FName,FString 浅谈


在下接触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