【UE4学习】C++输出字符串及FString字符串转换

本文详细介绍了虚幻引擎4 (UE4) 中FString的各种使用方法及与其他数据类型的转换技巧,包括输出到屏幕和日志文件,从不同数据类型转换为FString,以及FString与其他类型之间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


C++输出字符串

输出字符串到output log中

FString filePath
UE_LOG(LogTemp, Log, TEXT("%s"), *filePath);

UE_LOG(LogTemp, Error, TEXT("Hello,World!"));
  • 1
  • 2
  • 3
  • 4

输出字符串到屏幕上

FString filePath;
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("DLL_Init")));

GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("%s"), *filePath));
  • 1
  • 2
  • 3
  • 4

字符串转换

Converting FString to FNames

FString TheString = "UE4_C++_IS_Awesome";
FName ConvertedFString = FName(*TheString);
  • 1
  • 2

Converting std::string to FString

#include <string>

//....
std::string TestString = "Happy"; 
FString HappyString(TestString.c_str());
  • 1
  • 2
  • 3
  • 4
  • 5

Converting FString to std::string

#include <string>

//....
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 数值转std::to_string 
    • std::string to_string( long value );
    • std::string to_string( long long value );
    • std::string to_string( unsigned value );
    • std::string to_string( unsigned long value );
    • std::string to_string( unsigned long long value );
    • std::string to_string( float value );
    • std::string to_string( double value );
    • std::string to_string( long double value );

Converting FString to Integer

FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atoi(*TheString);
  • 1
  • 2

Converting FString to Float

FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atof(*TheString);
  • 1
  • 2

Converting Float/Integer to FString

FString NewString = FString::FromInt(YourInt);
FString VeryCleanString = FString::SanitizeFloat(YourFloat);
  • 1
  • 2

UE4 Source Header References

CString.h
UnrealString.h
NameTypes.h
StringConv.h (TCHAR_TO_ANSI etc)
  • 1
  • 2
  • 3
  • 4

CString.h可以查到更多,如

atoi64 (string to int64)
Atod    (string to double precision float)
  • 1
  • 2

更多关于FString的操作可以到UnrealString.h找到.

Converting FArrayReaderPtr to FString

uint8 data[512];  
FMemory::Memzero(data, 512);  

FMemory::Memcpy(data, ArrayReaderPtr->GetData(), ArrayReaderPtr->Num());  
FString str = ((const char*)data);  
  • 1
  • 2
  • 3
  • 4
  • 5

Converting Array to FString

TArray<uint8> content;  
...  
const std::string cstr(reinterpret_cast<const char*>(content.GetData()), content.Num());  
FString frameAsFString = cstr.c_str();  
UE_LOG(VRSLog, Warning, TEXT("%s"), *frameAsFString);  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Converting FString to Array

FString JsonStr;  
TArray<uint8> content;  

content.SetNum(JsonStr.Len());  
memcpy(content.GetData(), TCHAR_TO_ANSI(*JsonStr), JsonStr.Len());   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
FString StrData;  
const TCHAR* StrPtr = *StrData;  
FTCHARToUTF8 UTF8String(StrPtr);  
int32 CTXSize = UTF8String.Length();  

TArray<uint8> URLData;  
URLData.SetNum(CTXSize);  
memcpy(URLData.GetData(), UTF8String.Get(), CTXSize);  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Converting FString to char *

///1
FString str
string t = TCHAR_TO_UTF8(*str);
char * returnvalue = (char *)malloc(sizeof(char) * (t.length() + 1));
strncpy_s(returnvalue, t.length() , t.c_str(), t.length());  

///2
int ARPG_Database::BP_GetColumnIndex(int resultSet, FString columnName)
{
    return GetColumnIndex(resultSet, TCHAR_TO_ANSI(*columnName));
}

int ARPG_Database::GetColumnIndex(int iResult, const char* columnName)
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Converting FString to const char *

const char *plainText= TCHAR_TO_ANSI(*aes_content);
  • 1

Converting FString to TCHAR *

 int ARPG_Database::BP_GetColumnIndex(int resultSet, FString columnName)
 {
     return GetColumnIndex(resultSet, *columnName);
 }

 int ARPG_Database::GetColumnIndex(int iResult, const TCHAR* columnName)
 {
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Converting FString to FText

FString Str = TEXT("str");  
FText Text = FText::FromString(Str);
  • 1
  • 2

Converting FText to FString

FString Name = NameDesc->GetText().ToString();  
  • 1

参考

<think>我们正在使用虚幻引擎(UE)的C++编程环境。根据引用内容,打印字符串UE中有多种方式,包括使用UE_LOG宏和FString的Printf函数。 引用[1]提到:UE_LOG宏可以打印格式化的字符串到屏幕上、Output窗口和日志文件。 引用[2]提到:FString、FName和FTextUE中常用的字符串类型,并介绍了字符串处理方法。 引用[3]提到:UE4中的字符串以UTF-16格式存储,并提供了转换宏。 用户问题:如何在虚幻引擎中使用C++打印字符串? 解决方案: 1. 使用UE_LOG宏:这是最常用的日志打印方法,可以输出到控制台和日志文件。 2. 使用GEngine->AddOnScreenDebugMessage:如果需要在游戏屏幕上直接显示字符串,可以使用这个方法。 3. 使用FString::Printf:创建格式化的字符串,然后通过上述方式打印。 步骤: 1. 使用UE_LOG打印: UE_LOG有多个参数,第一个参数是日志类别(LogTemp),第二个参数是日志级别(如Log, Warning, Error),第三个是格式化字符串。 例如:UE_LOG(LogTemp, Log, TEXT("Hello World")); 2. 使用屏幕打印(需要当前有有效的GEngine): 例如:GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::White, TEXT("Hello World")); 注意:在UE中,字符串字面量需要使用TEXT()宏包裹,以支持跨平台字符编码。 详细说明: 根据引用[1]和[2],我们还可以使用FString的Printf函数来格式化字符串,然后再打印。 示例代码: 假设我们有一个C++类(比如在某个Actor类的方法中),我们可以这样写: ```cpp #include "Engine/Engine.h" // 如果需要使用GEngine // 在某个函数内 void AMyActor::MyFunction() { // 方法1:使用UE_LOG UE_LOG(LogTemp, Warning, TEXT("This is a log message. Current value is %d"), 123); // 方法2:使用屏幕打印 if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Hello from screen!")); } // 方法3:使用FString::Printf创建格式化字符串,然后打印 FString FormattedStr = FString::Printf(TEXT("The result is %f"), 3.14159f); // 然后我们可以用UE_LOG或者屏幕打印输出这个字符串 UE_LOG(LogTemp, Log, TEXT("%s"), *FormattedStr); // 或者 // GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FormattedStr); } ``` 注意: 1. 在UE_LOG和AddOnScreenDebugMessage中,使用TEXT包裹字符串字面量。 2. 使用FString时,传递到需要FString或TCHAR*的函数时,注意使用*运算符(如*FormattedStr)来获取TCHAR*。 3. 屏幕打印函数AddOnScreenDebugMessage的第一个参数是Key(如果使用-1,则每次调用都会覆盖之前的消息;如果使用不同的Key,则可以同时显示多条消息),第二个参数是显示时间(秒),第三个是颜色,第四个是字符串。 总结:在虚幻引擎C++中打印字符串,最常用的是UE_LOG和屏幕打印(GEngine->AddOnScreenDebugMessage)。同时,可以使用FString::Printf来格式化字符串。 根据要求,生成相关问题: §§相关问题§§ 1. UE_LOG的日志级别有哪些?如何自定义日志类别? 2. 如何在虚幻引擎C++中将其他数据类型(如整数、浮点数)转换字符串? 3. 虚幻引擎中FString、FText和FName有什么区别?分别在什么情况下使用? 4. 如何将FString转换为const char*以便与第三方库交互? 5. 在屏幕上打印消息时,如何控制消息的显示位置和样式?</think>在虚幻引擎(UE)中使用 C++ 打印字符串主要有以下两种常用方式: ### 1. **使用 `UE_LOG` 宏(推荐日志输出)** ```cpp #include "YourClassName.h" void YourClass::PrintStringExample() { // 基础打印 UE_LOG(LogTemp, Warning, TEXT("Hello Unreal Engine!")); // 格式化打印(支持 %s, %d, %f 等) FString PlayerName = TEXT("Alice"); int Score = 95; UE_LOG(LogTemp, Display, TEXT("Player %s scored %d points"), *PlayerName, Score); } ``` - **参数说明**: - `LogTemp`:默认日志类别(可自定义) - `Warning`:日志级别(`Display`/`Warning`/`Error`) - `TEXT()`:确保字符串使用 UE 的 UTF-16 编码 - `*PlayerName`:FString 转换为 `TCHAR*`(`FString` 需用 `*` 解引用) ### 2. **使用 `GEngine->AddOnScreenDebugMessage`(屏幕直接显示)** ```cpp #include "Engine/Engine.h" void YourClass::ScreenPrintExample() { if (GEngine) { // 简单显示(持续 5 秒,白色) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::White, TEXT("This is on-screen!")); // 动态内容 float Health = 75.0f; GEngine->AddOnScreenDebugMessage(-1, 0, FColor::Green, FString::Printf(TEXT("Health: %.1f%%"), Health)); } } ``` - **参数说明**: - `-1`:无唯一 Key(每次覆盖显示) - `5.f`:显示持续时间(秒) - `FColor::White`:文本颜色 - `FString::Printf()`:格式化字符串(类似 `sprintf`) --- ### 📌 关键注意事项 1. **字符串类型**: - 必须用 `TEXT()` 包裹字面量(如 `TEXT("Hello")`) - 使用 `FString` 处理动态字符串(支持 `Append`/`Replace` 等操作) - 转换其他类型用 `FString::Printf()` 或 `FString::FromInt()`[^3] 2. **编码问题**: - UE 内部使用 UTF-16,需用 `TCHAR_TO_ANSI()` 等宏转换编码[^3] ```cpp const char* CStr = TCHAR_TO_ANSI(*MyFString); // FString → char* ``` 3. **性能建议**: - 频繁日志用 `UE_LOG`(输出到文件/控制台) - 调试信息用 `AddOnScreenDebugMessage`(仅开发阶段) --- ### 示例代码整合 ```cpp // YourClass.cpp #include "Engine/Engine.h" #include "YourClass.h" void YourClass::DebugPrint() { // 日志输出 UE_LOG(LogTemp, Warning, TEXT("Log printed at %s"), *FDateTime::Now().ToString()); // 屏幕打印 if (GEngine) { FString Message = FString::Printf(TEXT("Frame: %d"), GFrameCounter); GEngine->AddOnScreenDebugMessage(-1, 1.5f, FColor::Yellow, Message); } } ``` > ⚠️ **注意**:发布版本中需移除调试打印,可通过 `#if !UE_BUILD_SHIPPING` 条件编译控制[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值