FName

本页面的内容:

内容浏览器 中为新资源命名时,变更动态材质实例中的参数或访问骨骼网格体中的一块骨骼时需要使用 FNames。FName 通过一个轻型系统使用字符串。在此系统中,特定字符串即使会被重复使用,在数据表中也只存储一次。FNames 不区分大小写。它们为不可变,无法被操作。FNames 的存储系统和静态特性决定了通过键进行 FNames 的查找和访问速度较快。FName 子系统的另一个功能是使用散列表为 FName 转换提供快速字符串。

FNames 不区分大小写,作为索引组合存储在唯一字符串和实例编号的表格中。

创建 FNames

FName TestHUDName = FName(TEXT("ThisIsMyTestFName"));

转换

FNames 只能被转换为 FStrings 和 FText,只能从 FStrings 进行转换。

从 FName

范例
FName FString TestHUDString = TestHUDName.ToString();
FName FText TestHUDText = FText::FromName(TestHUDName);

FName -> FText is valid in some cases, but be aware that the FNames's content will not benefit from the FText's "auto localization".

到 FName

范例
FString FName TestHUDName = FName(*TestHUDString);

FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive.

FText FName There is no direct conversion from FText to FName. Instead, convert to FString and then to FName.

FText -> FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive.

执行这些转换时,需注意它们可能包含对创建中的 FName 类型无效的字符。 NameTypes.h 文件中的 INVALID_NAME_CHARACTERS 宏定义 FNames 中无效的字符; FName 中的数个函数(如 IsValidObjectName())将对 FNames 在特定使用情况下的有效性进行检查。

对比

== 运算符用于对比两个 FNames,返回 true 或 false。它并不执行字符串的对比,而是对比索引中的数值,可极大地节约 CPU 开销。

FName::Compare 还可用于对比两个 FNames。如 < Other 将返回 < 0;如 == Other 将返回 0;如 > Other 将返回 > 0。

CompareFloat = TestFName.Compare(OtherFName); 

使用 FName

FName 的使用简单直接。例如您需要从 Actor 的骨骼网格体组件中选择名为“pelvis(骨盆)”的骨骼。以下的 C++ 代码展示了即时构建的 FName 的使用,它将同时被传递到 GetBoneRotation()

FRotator rotPelvis = Mesh->MeshGetInstance(this))->GetBoneRotation(FName(TEXT("pelvis")));

此代码将创建一个传递到 GetBoneRotation() 的 FName,将返回相应骨骼的 FRotator。包加载时骨骼命名将被加载到 FName 表格中,因此 FName 的构建函数可在散列表中找到骨骼的命名,不需要进行分配。

搜索名称表

如需确定 FName 是否在名称表中(但不希望进行自动添加),可在 FName 构建函数中补充一个不同的搜索类型:

if( FName(TEXT("pelvis"), FNAME_Find) != NAME_None )
{
    // Do something
}

如名称不在名称表中,FName 的索引将被设为 NAME_None。注意:将不对指针进行 null 检查,因为使用的是普通字符串。