【UE5 C++课程系列笔记】11——FString、FName、FText的基本使用
目录
概念
常用操作示例
一、FString
1.1 创建字符串
1.2 字符串拼接
1.3 字符串长度
1.4 字符串查找
1.5 字符串替换
1.6 比较字符串
二、FName
2.1 创建FName
2.2 比较FName
2.3 在容器中使用 FName
三、FText
3.1 创建FText
3.2 格式化FText
3.3 显示文本控件内容
FString、FName、FText类型的转换
一、 FString、FName、FText互转
二、其它类型转FString
三、FString转其它类型
概念
FString
是UE中用于处理字符串的类型。它提供了丰富的字符串操作功能,类似于标准 C++ 中的 std::string
,但在 UE 环境下更加方便和安全地处理游戏开发中的各种文本信息,如玩家名称、物品描述、对话框内容等。
FName
是UE中用于存储和处理名称的轻量级类型。它主要用于需要高效比较和查找的名称相关场景,如资源名称、属性名称、标签名称等。FName
内部使用了一个全局的名称查找表,通过对字符串进行哈希处理,使得比较操作非常快速。
FText
是虚幻引擎用于处理本地化文本的类型。在游戏开发中,为了适应不同的语言和地区,需要对文本进行本地化处理,FText
就是为此设计的。它可以根据当前游戏的语言设置动态地显示正确的本地化文本。
常用操作示例
一、FString
1.1 创建字符串
在UE中,有如下三种创建FString类型变量的方式。
FString MyString1 = FString(TEXT("Hello, World!"));
FString MyString2 = TEXT("Hello, World!");
FString MyString3 = "Hello, World!";
1.2 字符串拼接
使用 +
运算符:
FString FirstName = TEXT("Flynt");
FString LastName = TEXT("Lovett");
FString FullName = FirstName + LastName;
使用 Append
函数:
FString Greeting = TEXT("Hello");
Greeting.Append(", How are you?");
1.3 字符串长度
使用 Len
函数:
FString MyString = TEXT("Test String");
int32 Length = MyString.Len();
1.4 字符串查找
使用 Find
函数查找子字符串在原字符串中的位置:
FString MyString = TEXT("This is a test string");
int32 Position = MyString.Find(TEXT("test")); //10
1.5 字符串替换
Replace
方法返回新的替换后的字符串副本,原字符串保持不变,适用于需要保留原字符串并获取替换结果副本的场景,比如在函数中返回处理后的字符串,同时不影响传入的原始字符串。
ReplaceInLine
直接修改原字符串,更适合当你确定要在当前字符串实例上进行修改,不需要额外保留原字符串的情况,例如在对一些临时构建的字符串进行就地修改时使用
Replace:
FString MyString = TEXT("I like apples");
MyString = MyString.Replace(TEXT("apples"), TEXT("bananas"));
UE_LOG(LogTemp, Warning, TEXT("New String: %s"), *MyString); //New String: I like bananas
ReplaceInline:
FString MyString = TEXT("I like apples");
MyString.ReplaceInline(TEXT("apples"), TEXT("bananas"));
UE_LOG(LogTemp, Warning, TEXT("New String: %s"), *MyString); //I like bananas
1.6 比较字符串
比较两个 FString
的大小可以使用比较运算符(==
、!=
、<
、>
、<=
、>=
),比较规则是基于字典序:
FString String1 = TEXT("Apple");
FString String2 = TEXT("Banana");
if (String1 < String2)
{
// String1在字典序中排在String2之前
}
二、FName
2.1 创建FName
FName MyName = FName(TEXT("MyObjectName"));
2.2 比较FName
由于 FName
的哈希表机制,这种比较操作非常高效,尤其适用于大量名称比较的场景,如游戏资源加载时检查资源名称是否匹配。比较两个 FName
使用 ==
运算符:
FName Name1 = FName(TEXT("Player"));
FName Name2 = FName(TEXT("Player"));
if (Name1 == Name2)
{
// 两个名称相同
}
2.3 在容器中使用 FName
因为 FName
的高效比较特性,它经常用于作为容器(如 TMap
、TSet
)的键类型,例如:
TMap<FName, int32> NameToValueMap;
FName KeyName = FName(TEXT("MyKey"));
int32 Value = 10;
NameToValueMap.Add(KeyName, Value);
三、FText
3.1 创建FText
FText MyText = FText::FromString(TEXT("Hello, World!"));
FText LocalizedText = FText::FromString(NSLOCTEXT("MyNamespace", "MyKey", "This is a localized text").ToString());
NSLOCTEXT
宏用于定义本地化文本的键和默认文本内容,它返回一个 FText
对象,在实际运行时,根据游戏的本地化设置,会从本地化资源文件中查找真正的本地化文本。
3.2 格式化FText
在如下代码中,通过 FText::Format
函数,将 AppleCount
的数值格式化为文本后替换到 {0}
的位置,生成最终的格式化文本。
FTextFormat Format = FTextFormat::FromString(TEXT("You have {0} apples."));
int32 AppleCount = 5;
FText FormattedText = FText::Format(Format, FText::AsNumber(AppleCount));
3.3 显示文本控件内容
在 UI 系统中,通常使用 FText
来显示文本内容,如下:
UCLASS()
class MYGAME_API UMyWidget : public UUserWidget
{
public:
void UpdateText()
{
FText DisplayText = FText::FromString(NSLOCTEXT("MyNamespace", "MyWidgetText", "Widget Text").ToString());
MyTextBlock->SetText(DisplayText);
}
};
这样当游戏语言设置发生变化时,FText
会自动从本地化资源文件中获取新的本地化文本并显示,无需开发者手动干预。
FString、FName、FText类型的转换
一、 FString、FName、FText互转
FString TestString = TEXT("Test String");
//FString->FName
FName TestName = FName(*TestString);
//FString->FText
FText TestText = FText::FromString(TestString);
//FName->FString
FString TestString2 = TestName.ToString();
//FName->FText
FText TestText2 = FText::FromName(TestName);
//FText->FString
FString TestString3 = TestText.ToString();
//FText->FName
FName TestName2 = FName(TestText.ToString());
二、其它类型转FString
//float->FString
float MyFloat = 109.3f;
FString FloatString = FString::SanitizeFloat(MyFloat);
//int32->FString
int32 MyInt = 99;
FString IntString = FString::FromInt(MyInt);
//bool->FString
bool bMyBool = true;
FString BoolString = bMyBool ? TEXT("true") : TEXT("false");
//FVector->FString
FVector Mylocation = FVector(100.0f, 20.f, 30.f);
FString VectorString = Mylocation.ToString();
//FVector2D->FString
FVector2D MyVector2D = FVector2D(100.0f, 20.f);
FString Vector2DString = MyVector2D.ToString();
//Rotation->FString
FRotator MyRotator = FRotator(40.f, 50.f, 60.f);
FString RotatorString = MyRotator.ToString();
//FLinearColor->FString
FLinearColor MyColor = FLinearColor::Blue;
FString ColorString = MyColor.ToString();
//UObject->FString
AActor* MyActor = this;
FString ActorString = (MyActor != nullptr) ? MyActor->GetName() : FString(TEXT("None"));
三、FString转其它类型
//FString->bool
bool MyBackBool = BoolString.ToBool();
//FString->int
int32 MyBackInt = FCString::Atoi(*IntString);
//FString->float
float MyBackFloat = FCString::Atoi(*FloatString);