UE5基本数据类型

  • bool : 表示布尔值,只有两个取值:truefalse,用于表示逻辑条件。
  • int8: 表示 8 位的有符号整数,范围是 −128−128 到 127127。
  • uint8: 表示 8 位的无符号整数,范围是 00 到 255255。
  • int16: 表示 16 位的有符号整数,范围是 −32,768−32,768 到 32,76732,767。
  • uint16: 表示 16 位的无符号整数,范围是 00 到 65,53565,535。
  • int32: 表示 32 位的有符号整数,范围是 −2,147,483,648−2,147,483,648 到 2,147,483,6472,147,483,647,通常是最常用的整数类型。
  • longlong: 表示 64 位的有符号整数,范围非常大,一般用于需要更大数值的情况,占用 8 个字节。
  • float: 表示 32 位的单精度浮点数,适合处理小数部分的数值,常用于需要进行物理运算、3D 模型坐标等场景。
  • ptrint: 表示指针大小的整数,大小依赖于平台(32 位或 64 位),用于存储指针或地址。

2. 禁止使用 C++ 的基本数据类型:

UE4(虚幻引擎)中推荐使用自己的数据类型(如上所述),而不是直接使用 C++ 的原生数据类型,如 intcharfloat 等。这是因为虚幻引擎是跨平台的,而不同平台对基础数据类型的大小和实现可能有所不同。使用 UE 提供的跨平台基础类型,可以确保代码在不同平台(如 Windows、Linux、主机游戏设备等)上的一致性,避免平台差异导致的错误或问题。

3 字符串

UE 中的字符串类型:FString、FName 和 FText

FString
  • 用途FString 是 UE 中最常用的字符串类型,适用于程序端的字符串操作。它是一个动态大小的字符串类,可以存储任何长度的文本。通常用于存储临时数据,比如文件路径、日志信息、调试文本、配置文件内容等。
  • 特点
    • 支持对字符串进行复杂的操作(拼接、截取、查找等)。
    • 由于它是动态分配内存的,所以可以方便地处理变化长度的文本。
    • 它的内存管理较为复杂,通常涉及堆内存,因此在性能敏感的场景中不适合频繁使用。
FName
  • 用途FName 主要用于 标识符名称记录 。它并不是为了存储大量文本而设计的,而是为了优化内存使用和性能,尤其是在涉及到大量相同字符串的场景中(例如对象名、资源名等)。当你有很多重复的字符串时,FName 可以避免多次存储相同的字符串,提高效率。
  • 特点
    • 它是基于 FNameEntry 的内存管理机制,所有相同的字符串都只存储一次。
    • FString 不同,FName 是不可变的,也就是说它不支持像 FString 那样的动态操作。
    • FName 存储的是字符串的引用(即指向已存储字符串的标识符),而不是整个字符串本身。
    • 它在执行比较时比 FString 快,因为它直接比较内部存储的索引值,而不是每次比较整个字符串。
FText
  • 用途FText 主要用于 国际化(i18n)本地化(l10n) 相关的字符串,适合用于用户界面(UI)展示。FText 支持翻译,并且能够根据不同语言和文化设置提供不同的显示内容。
  • 特点
    • FText 用于 UI 显示文本,确保文本能根据玩家的语言设置进行翻译和本地化处理。
    • 它提供了对文本的多语言支持(例如,支持不同的字符串翻译、文化格式化等),是处理多语言项目的关键类。
    • FStringFName 不同,FText 具有更高的内存开销,因为它需要支持本地化的文本数据结构。
    • FText 的本地化是通过 "Text Localization" 系统进行的,允许对字符串进行翻译和格式化,确保在不同的地区和语言中显示正确的内容。

2. FString、FName 和 FText 的用途

  • FString 用于程序端 :它适合用于程序内部的字符串处理,尤其是在非 UI 相关的地方。例如,在游戏逻辑中,使用 FString 可以方便地进行字符串的拼接、处理和转换。
  • FName 用于记录名称 :由于 FName 采用优化的内存管理,它适用于标识对象或资源的名称。举例来说,在游戏开发中,很多时候你需要比较或者存储大量的对象名、资源名、类名等,这时使用 FName 可以有效节省内存并提高性能。比如,在 Unreal 中,很多对象(例如材质、蓝图、声音文件等)都使用 FName 来标识其名字。
  • FText 用于 UI 端 :在 UI 上显示的文本通常需要支持多语言和文化的格式化。这时 FText 就是最佳选择。例如,游戏中的对话框、按钮文字、任务提示等,使用 FText 可以方便地管理不同语言的翻译。
cpp 复制代码
#include "CoreMinimal.h"
#include "Engine/Engine.h"

void ExampleStringConversions()
{
    // Using TEXT macro to define a wide character string
    FName myName = TEXT("PlayerCharacter");
    FString myStringFromFName = myName.ToString();

    // From FString to FName using TEXT macro
    FString myStringToFName = TEXT("PlayerCharacter");
    FName myNameFromFString(*myStringToFName);

    // From FText to FString
    FText myText = FText::FromString(TEXT("Hello World"));
    FString myStringFromFText = myText.ToString();

    // From FString to FText
    FString myStringToFText = TEXT("Hello World");
    FText myTextFromFString = FText::FromString(myStringToFText);
}
cpp 复制代码
#include "CoreMinimal.h"
#include "Engine/Engine.h"

void ExampleFStringFunctions()
{
    // 构造函数
    FString str1 = TEXT("Hello");
    FString str2(TEXT("World"));

    // 字符串拼接
    FString concatenatedStr = str1 + TEXT(" ") + str2;
    str1.Append(TEXT(" Universe"));

    // 查找和替换
    int32 index = concatenatedStr.Find(TEXT("World"));
    if (index != INDEX_NONE)
    {
        concatenatedStr.ReplaceInline(TEXT("World"), TEXT("Universe"));
    }

    // 分割和连接
    TArray<FString> parts;
    FString longStr = TEXT("Apple,Banana,Cherry");
    longStr.ParseIntoArray(parts, TEXT(","), true);

    FString joinedStr = FString::Join(parts, TEXT(";"));

    // 大小写转换
    FString upperStr = concatenatedStr.ToUpper();
    FString lowerStr = concatenatedStr.ToLower();

    // 修剪空格
    FString spacedStr = TEXT("   Trim Me   ");
    FString trimmedStr = spacedStr.TrimStartAndEnd();

    // 长度检查
    int32 length = concatenatedStr.Len();
    bool isEmpty = concatenatedStr.IsEmpty();

    // 格式化
    FString formattedStr;
    formattedStr.Printf(TEXT("Formatted String: %s, Length: %d"), *concatenatedStr, length);

    // 输出结果
    UE_LOG(LogTemp, Log, TEXT("Concatenated: %s"), *concatenatedStr);
    UE_LOG(LogTemp, Log, TEXT("Appended: %s"), *str1);
    UE_LOG(LogTemp, Log, TEXT("Replaced: %s"), *concatenatedStr);
    UE_LOG(LogTemp, Log, TEXT("Parsed Parts: %s"), *joinedStr);
    UE_LOG(LogTemp, Log, TEXT("Upper Case: %s"), *upperStr);
    UE_LOG(LogTemp, Log, TEXT("Lower Case: %s"), *lowerStr);
    UE_LOG(LogTemp, Log, TEXT("Trimmed: %s"), *trimmedStr);
    UE_LOG(LogTemp, Log, TEXT("Length: %d"), length);
    UE_LOG(LogTemp, Log, TEXT("Is Empty: %s"), isEmpty ? TEXT("True") : TEXT("False"));
    UE_LOG(LogTemp, Log, TEXT("Formatted: %s"), *formattedStr);
}
相关推荐
日月云棠2 天前
UE5 Lyra源码分析——Audio_Analysis音频模块全面分析
ue5·音视频
成都渲染101云渲染66662 天前
2026云渲染平台哪个好?建筑、动画、UE5项目选择云渲染的3个关键标准
ue5
清泓y3 天前
UE 物理系统知识分享
面试·ue5·游戏程序
清泓y3 天前
UE移动开发技术面试题
android·面试·ue5·ue4·游戏程序
清泓y3 天前
UE基础知识与引擎架构面试题
面试·架构·ue5·ue4·游戏程序
mengzhi啊5 天前
UE5关卡切换 传统加载(阻塞)vs流式加载(非阻塞)。还有加载关卡3种办法
ue5
电子云与长程纠缠5 天前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎
Duo1J7 天前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
directx3d_beginner8 天前
26,怪物受击接口改为C++
ue5
远离UE410 天前
UE5 UV邻接 Niagara潜水模拟 学习笔记
ue5·uv