FText

FText 代表一个显示字符串。为用户显示的文本都需要由 FText 进行处理。FText 类拥有本地化的内置支持,可处理已本地化并存储在查找表中的文本内容,以及在运行时被本地化的文本,如数字、日期、时间和格式化文本。甚至可用 FText 处理无需进行本地化的文本。包括用户输入内容,如玩家名和 Slate 显示的文本。FText 不提供任何变异函数,因为对显示字符串进行修改是非常不安全的操作。

Slate 和 FText

整体而言,Slate 弃用了 FString 的公开钩,转而支持 FText。因为 FText 可在其接口后处理所有本地化问题,Slate 未来将支持诸如实时语言勾选之类的功能。使用 FString 将无法实现。使用 FText 还可增强文本渲染的性能。使用 FText 时,字符串被假定为不可变,因此字符串的内存地址可用作快速缓存查找的键。与检查字符串更新或对其重新测量进行显示相比较,这种方法的开销较小。最后,在 Slate 中使用 FText 意味着本地化支持将与 UI 系统自然整合,形成本地化最佳方案的坚实框架。

创建 FText

因为 FText 的本地化应用,每个 FText 必须以键和文本进行设置。使用 LOCTEXT 和 NSLOCTEXT 宏可对 FText 进行正确设置。 LOCTEXT 将键和文本视为参数。所有参数必须为字符串文字。所有文字量将通过本地化系统进行传递。

必须首先将全局 LOCTEXT_NAMESPACE 宏设为字符串文字,以指定该本地化键的命名空间。

使用 LOCTEXT 宏从字符串创建 FText:

/* Top of File */ 
#define LOCTEXT_NAMESPACE "Your Namespace" 
... 
FText TestHUDText = LOCTEXT( "Your Key", "Your Text" ) 
... 
#undef LOCTEXT_NAMESPACE 
/* Bottom of File */ 

除键和文本外,NSLOCTEXT 还将命名空间作为参数。所有参数必须为字符串文字。所有文字量将通过本地化系统进行传递。

FText TestHUDText = NSLOCTEXT( "Your Namespace", "Your Key", "Your Text" ) 

也可使用以下任意一个语法创建空白 FText:

  • FText TestHUDText = FText::GetEmpty();

  • FText TestHUDText = FText();

转换

字符串变量

从 FText

范例
FText FString TestHUDString = TestHUDText.ToString();

FText -> FString 不可靠。它在一些语言的转换中存在潜在损耗。

FText FName FText 到 FName 的转换不存在。但可先转换到 FString,再转换到 FName。

FText -> FString -> FName 不可靠。因为 FName 不区分大小写,所以转换存在损耗。

FText 字符串为不可变,因此必须将其复制,否则无法对返回的字符串进行修改。

到 FText

范例
FName FText TestHUDText = FText::FromName(TestHUDName);

FName -> FText 在一些情况下有效,但需注意 — FNames 内容不会从 FText 的“自动本地化”中受益。

FString FText TestHUDText = FText::FromString(TestHUDString);

FString -> FText 在一些情况下有效,但需注意 — FString 内容不会从 FText 的“自动本地化”中受益。

数字变量

从 FName 字符串到数字变量不存在转换。

到 FText

可使用 FText::AsNumber() 将浮点和 int 变量转换为 FText。此函数生成一个 FText,代表当前文化中传递的数字。

范例:

FText::AsNumber( CurrentHealth )

额外的数字转换包括:

  • FText::AsPercent()

  • FText::AsCurrency()

  • FText::AsDate()

  • FText::AsTime()

对比

可使用 FText::EqualTo()FText::EqualToCaseIgnored() 对两个 FText 字符串进行对比,接收 true 或 false 作为结果。使用 FText::CompareTo() 或者 FText::CompareToCaseIgnored() 对比字符串将返回一个整数值。

FText 当前不对这些对比操作公开运算符,因为这些操作不是 FString 一类的简单序号比较。我们不使用常规运算符表达操作的开销。

格式化 FText

可使用 FText::Format() 函数将不同的 FText 串联起来。如有需要,可将其保存到 FText 变量。

FText::Format( LOCTEXT( "HelloMessageFormat",  "Hello {0}," ), PlayerName ) 

当前,格式化函数只将 FText 视为参数。

FText::Format 支持两种不同类型的格式参数:排序和命名。

排序参数

  • 参数 = {0}、{1}、{2} 等...

  • 大括号表示格式参数的开头和结尾,数值说明已传递的参数。

    FText::Format( LOCTEXT( "HealthFormatStr",  "{0} / {1}" ), FText::AsNumber( CurrentHealth ), FText::AsNumber( MaxHealth )  )

命名参数

  • 参数 = {Name}、{ID}、{Health} 等...

  • 大括号表示格式参数的开头和结尾,大括号之间的文本是在传入的 FFormatNamedArgs 集合中找到的参数名称。

    FFormatNamedArguments Arguments;
    Arguments.Add(TEXT("CurrentHealth"), FText::AsNumber( CurrentHealth ));
    EditorErrors.Error(FText::Format(LOCTEXT("ExampleFText", "You currently have {CurrentHealth} health left."), Arguments ) );

HUD 中的 FText

Canvas

如需使用 Canvas 在 HUD 中显示 FText,必须新建一个 FCanvasTextItem

FCanvasTextItem TextItem( FVector2D::ZeroVector, TestHUDText, BigFont, FLinearColor::Black);

设置文本变量即可更改 FCanvasTextItem 的文本:

FFormatNamedArguments Arguments;
Arguments.Add(TEXT("CurrentHealth"), FText::AsNumber( CurrentHealth ));
TextItem.Text = FText::Format(LOCTEXT("ExampleFText", "You currently have {CurrentHealth} health left."), Arguments ) ;

调用 FCanvas::DrawItem() 函数即可将 FText 实际显示到屏幕上:

Canvas->DrawItem(TextItem,10.0f,10.0f);

必须在 HUD 类的 DrawHUD() 函数中调用 DrawItem() 函数,或在以 DrawHUD() 开始的函数链中调用。

蓝图中的 FText

蓝图支持文本文字。文本数值的任意输入引脚将支持在节点中被指派一个数值,这些字符串将被收集用作本地化。

FText::Format蓝图中也为可用。格式文本可为文字或连接到引脚。作为文本使用时,它将为格式化自动生成参数。因此,输入文字“There are {number} days until {day}.”后,一个 Number 引脚和一个 Day 引脚将被自动添加到节点。这些引脚可作为文字被填充或从变量被填充,输出文本将以钩住引脚的数值替代参数。

格式引脚被连接时,格式无法被解密,因为它是可变的。因此,您可自行添加引脚并以可能的参数对它们进行命名。这样您便能将 Format Text 节点设置好,以应对多种可能。Format 变量中出现参数匹配时,它将应用提供的信息。

Details 中可对引脚名进行变更、添加和移除。