本节主要介绍FName、FText 和 FString三个的异同
在 内容浏览器 中为新资源命名时,变更动态材质实例中的参数或访问骨骼网格体中的一块骨骼时需要使用 FNames。FNames 不区分大小写。它们为不可变,无法被操作。
FName TestHUDName = FName(TEXT("ThisIsMyTestFName"));
FNames 只能被转换为 FStrings 和 FText,只能从 FStrings 进行转换。
== 运算符用于对比两个 FNames,返回 true 或 false。它并不执行字符串的对比,而是对比索引中的数值,可极大地节约 CPU 开销。
FName::Compare 还可用于对比两个 FNames。如小于 Other 将返回小雨 0;如等于 Other 将返回 0;如大于 Other 将返回大于 0。
CompareFloat = TestFName.Compare(OtherFName);
FName 的使用简单直接。例如您需要从 Actor 的骨骼网格体组件中选择名为“pelvis(骨盆)”的骨骼。以下的 C++ 代码展示了即时构建的 FName 的使用,它将同时被传递到 GetBoneRotation()。
FRotator rotPelvis = Mesh->MeshGetInstance(this))->GetBoneRotation(FName(TEXT("pelvis")));
如需确定 FName 是否在名称表中(但不希望进行自动添加),可在 FName 构建函数中补充一个不同的搜索类型:
if( FName(TEXT("pelvis"), FNAME_Find) != NAME_None )
{
// Do something
}
如名称不在名称表中,FName 的索引将被设为 NAME_None。注意:将不对指针进行 null 检查,因为使用的是普通字符串。
FName参考指南
在虚幻引擎4(UE4)中,文本本地化的主要组件是 FText 类。此类通过提供下列功能支持文本本地化,因此面向用户的所有文本都应使用此类:
创建本地化的文本文字。
设置文本格式(根据占位符模式生成文本)。
根据数字生成文本。
根据日期时间生成文本。
生成衍生文本,如将文本设为大写或小写
Ftext 同时具有 AsCultureInvariant 函数(或 INVTEXT 宏),可创建非本地化的(即“语言不变”)文本。这在进行如将玩家名从外部API转换为可在用户界面显示的文本等操作时,十分有用。
可使用 FText::GetEmpty() 或仅使用 FText(),创建空白 FText。
FText 和 Fstring 间可相互转换。但 FText 包含与本地化数据关联的字符串,而 FString 仅包含一条字符串,因此以上方法固然会造成损失,将废弃(或无法创建)本地化数据。另一方法是文本值整理,其可提供无损转换,但该方法产生的数据更适合内部整理,而非供用户查看。
下列转换函数可生成不含本地化数据的 FText 字符串:
要从 FText 转换为 FString,请使用 ToString 函数。得到的 FString 将包含 FText 的字符串数据,但不包含本地化数据。
FText 数据比简单字符串复杂,因此其不支持重载运算符比较。相反,其提供多个函数,以执行识别其中细微数据的比较。可用下列比较函数:
Slate和UMG使用内置控件的 FText 属性或参数,此类内置控件显示或控制面向用户文本。建议使用用户构建的自定义控件的 FText。
要利用带画布的HUD系统显示 FText,新建 FCanvasTextItem 并将其 Text 变量设为要显示的文本,如下放范例代码所示:
// Create a new FCanvasTextItem instance to contain the text.
FCanvasTextItem TextItem(FVector2D::ZeroVector, TestHUDText, BigFont, FLinearColor::Black);
// Add the text into the FCanvasTextItem.
TextItem.Text = FText::Format(LOCTEXT("ExampleFText", "You currently have {0} health left."), CurrentHealth);
// Draw the text to the screen with FCanvas::DrawItem.
Canvas->DrawItem(TextItem, 10.0f, 10.0f);
FText 参考指南
与 FName 和 FText 不同,FString 是唯一允许操作的字符串类。字符串操作的可用方法有许多,如大小写转换、摘录子字符串和逆向。FStrings 可被搜集、修改、并与其他字符串进行对比。然而这些操作可能使 FString 的开销比不可变字符串类更大。
FString TestHUDString = FString(TEXT("This is my test FString."));
用 FString::Printf 构建的 FString 可被存入 FStrings,并与 UE_LOG 调试信息 一同显示到屏幕上。格式参数拥有和 C++ printf 函数相同的说明符,如下例所示。
FString AShooterHUD::GetTimeString(float TimeSeconds)
{
// only minutes and seconds are relevant
const int32 TotalSeconds = FMath::Max(0, FMath::TruncToInt(TimeSeconds) % 3600);
const int32 NumMinutes = TotalSeconds / 60;
const int32 NumSeconds = TotalSeconds % 60;
const FString TimeDesc = FString::Printf(TEXT("%02d:%02d"), NumMinutes, NumSeconds);
return TimeDesc;
}
使用 %s 参数包含 FStrings 时,必须使用 * 运算符返回 %s 参数所需的 TCHAR*。
从 FString
从 FString
从 FString 到 int 和浮点型数字变量,以及到布尔型变量之间也存在转换。
到 FString
对于其他数值转换,可使用带合适参数的 FString::Printf() 函数。
重载的 == 运算符可用于两个 FString 的对比,或把 FString 比作一个 TCHAR*s 阵列。此外还有 FString::Equals() 法, 用 FString 进行测试,用 ESearchCase 枚举进行对比,确定是否作为参数忽略大小写。如希望对比忽略大小写,使用 ESearchCase::IgnoreCase;如不忽略,则使用 ESearchCase::CaseSensitive。
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
在 FString 中搜索时有两种搜索类型。
第一种是 FString::Contains(),找到子字符串后返回 true,否则返回 false。FString::Contains() 可搜索 FString 或 TCHAR*s 子字符串。ESearchCase 枚举可用于指定搜索是否忽略大小写。此外,ESearchDir 枚举可用于指定搜索的方向。默认设置为忽略大小写,从开始执行搜索。
TestHUDString.Contains(TEXT("Test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
第二种是 FString::Find(),返回找到的第一个子字符串实例的索引。FString::Find() 可对 FString 或 TCHAR*s 子字符串进行搜索。和 FString::Contains() 一样,可对大小写敏感度和搜索方向进行指定,默认设置为忽略大小写并从字符串开头开始搜素。也可在索引中任选一个索引开始搜索。如 FString::Find() 未找到子字符串,它将返回 -1。
TestHUDString.Find(TEXT("test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd, 10);
可通过许多函数操作字符串。在此会提到部分函数,如需了解可用 FString 函数的完整列表,请查看 UnrealString.h 或 FString 上的 API 文档。
如需在 HUD 中显示 FString,使用 Canvas 调用 FCanvas::DrawText() 函数:
Canvas->DrawText(BigFont, TestHUDString, 110.0f,110.0f);
必须在 HUD 类的 DrawHUD() 函数中调用 DrawText() 函数,或在以 DrawHUD() 开始的函数链中调用。
使用 UEngine::AddOnScreenDebugMessage() 将调试信息打印到 视口。此函数接受以下四个参数(按照顺序):.
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TestHUDString);
UE_LOG(LogClass, Log, TEXT("This is a testing statement.%s"), *TestHUDString);