目录
概念
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);