详解虚幻引擎的字符串类型

发布时间:2026/9/24 19:26:25

详解虚幻引擎的字符串类型 FName的概念:在虚幻引擎中FName是一种专为高性能标识场景设计的轻量级、不可变、基于全局字符串池的哈希优化字符串类型是引擎核心基础数据类型之一用于高效存储和匹配 “标识性字符串”而非动态文本。一、FName 的核心特性全局字符串池String Pool机制FName 不会直接存储字符串内容而是将唯一字符串存入引擎的全局哈希池FNamePool每个字符串对应一个FNameEntry含字符串内容 哈希值FName 实例仅存储指向该条目的索引 编号uint32。相同字符串的 FName 复用同一池条目避免内存冗余如多次创建FName(Enemy)仅存一份字符串引擎启动时预加载常用字符串如资源路径、内置名称进一步提升效率。不可变性FName 创建后内容无法修改若需变更只能新建实例 —— 保证哈希值稳定避免查找 / 匹配失效。默认大小写不敏感例如FName(Enemy)和FName(enemy)会被视为同一 FName可通过项目设置开启大小写敏感但不推荐简化标签、名称的匹配逻辑。高效比较与查找FName 的比较直接对比池索引O (1) 时间复杂度远快于普通字符串的逐字符比较O (n)适合作为键值或标识。二、FName 的典型用途对象标识Actor、Component、UObject 的实例名称如Actor-GetFName()标签系统Actor/Component 的Tags属性TArrayFName、GameplayTag 的名称部分资源路径蓝图、纹理、音效等资源的路径标识如FName(/Game/Blueprints/BP_Player)反射与元数据标识 UProperty、UFunction 的名称如GetPropertyByName(FName(Health))高效键值TMapFName, UObject*等容器的键类型利用快速比较特性。三、FName 与其他字符串类型的区别虚幻引擎中三种核心字符串类型的定位差异类型核心特点适用场景FName不可变、池化、哈希优化、大小写不敏感标识、键值、快速比较 / 查找FString可变、支持复杂文本操作拼接 / 格式化动态文本处理玩家输入、日志FText本地化支持、多语言适配UI 文本、玩家可见的本地化内容// 创建从字符串字面量/ FString 转换 FName EnemyTag FName(TEXT(Enemy)); FString Str TEXT(Player); FName PlayerTag FName(*Str); // 比较O(1) 效率 bool bEqual (EnemyTag FName(TEXT(enemy))); // true默认大小写不敏感 // 转换FName → FString/FText FString TagStr EnemyTag.ToString(); FText TagText FText::FromName(EnemyTag); // 有效性检查 bool bValid !EnemyTag.IsNone(); // 空 FName 为 NAME_None四、如何将普通字符串传入 / 转换为 FNameFName 支持从多种普通字符串类型转换核心是通过构造函数或显式转换以下是常见场景1. 从 C 原生字符串const char*/ 字面量转换直接通过 FName 构造函数建议用TEXT()宏兼容 Unicode虚幻引擎默认使用宽字符// 直接传入字符串字面量推荐用TEXT宏 FName TagName FName(TEXT(Enemy)); // 从const char*变量转换 const char* Str Player; FName PlayerName FName(Str); // 或 FName(TEXT(Str))需确保Str是宽字符2. 从std::string转换需先将std::string转为const char*解引用再传入 FName 构造函数std::string StdStr Interactable; FName InteractTag FName(TCHAR_TO_ANSI(*StdStr.c_str())); // 或直接 FName(StdStr.c_str())3. 从虚幻 FString 转换FString 是虚幻的可变字符串类型转换时需解引用 FString*FString获取TCHAR*FString FStr TEXT(Frozen); FName FrozenTag FName(*FStr); // 核心用*解引用FString为TCHAR*4. 函数参数中直接传入普通字符串若函数参数要求 FName如ActorHasTag(FName)可直接传字符串字面量隐式转换// 直接传字符串字面量引擎自动隐式转为FName bool bIsEnemy MyActor-ActorHasTag(TEXT(Enemy));五、注意事项大小写问题FName 默认不区分大小写若需严格区分需在项目设置中开启 “Case Sensitive FNames”不推荐可能破坏引擎逻辑性能开销转换普通字符串到 FName 时引擎会检查字符串池若不存在则添加频繁转换动态文本如玩家输入会导致字符串池膨胀需避免空值处理空字符串会转为 FName 的NAME_None空 FName可通过IsNone()检查FName EmptyName FName(TEXT()); bool bIsNone EmptyName.IsNone(); // 返回trueMyTag是什么类型?在 C 标准语法和虚幻引擎的编译环境中MyTag的类型需分场景讨论核心差异源于字符编码配置和引擎的类型定义一、标准 C 中的类型在原生 C 中双引号包裹的字符串字面量如MyTag的默认类型是const char*指向窄字符数组的常量指针窄字符char通常占 1 字节对应 ASCII 编码。如果是带L前缀的字符串如LMyTag则类型为const wchar_t*指向宽字符数组的常量指针宽字符wchar_t占 2 或 4 字节对应 Unicode 编码。二、虚幻引擎环境中的类型虚幻引擎默认启用UNICODE宏可在项目设置中确认并通过TCHAR统一字符类型TCHAR是虚幻定义的通用字符类型在 Windows 平台等价于wchar_t宽字符其他平台可能等价于char窄字符若直接写MyTag在虚幻的编译环境中它仍会被识别为const char*但虚幻的核心 API如 FName 构造函数支持从const char*隐式转换为TCHAR*或直接兼容若用TEXT(MyTag)包裹推荐写法则会根据UNICODE宏自动适配启用UNICODE时TEXT(MyTag)→LMyTag→ 类型为const TCHAR*即const wchar_t*未启用UNICODE时TEXT(MyTag)→MyTag→ 类型为const TCHAR*即const char*。三、为什么虚幻中传入MyTag不会报错虽然MyTag本身是const char*但 FName 类提供了兼容const char*的构造函数或引擎内部做了隐式转换同时GetAllActorsWithTag的第二个参数要求的FName支持从const char*/const TCHAR*隐式创建因此编译器会自动完成类型转换不会报错。TEXT()是什么?在虚幻引擎以及 Windows API、C 跨平台开发场景中TEXT()是一个用于统一字符编码的宏核心作用是让字符串字面量根据编译环境自动适配窄字符ANSI/char或宽字符Unicode/WCHAR最终转换为虚幻引擎的通用字符类型TCHAR。一、TEXT()的本质与作用1. 解决字符编码兼容性问题C 中有两种常见字符类型窄字符char占 1 字节通常对应 ASCII 编码仅支持英文字符宽字符WCHAR/wchar_t占 2 字节Windows或 4 字节Linux支持 Unicode 编码可存储中文、日文等多语言字符。虚幻引擎定义了 **TCHAR** 作为 “通用字符类型”在 Windows 平台默认等价于WCHARUnicode其他平台可根据配置调整。TEXT()宏的作用就是将普通字符串字面量如Enemy包装为TCHAR类型的字面量避免编码不匹配导致的编译错误或乱码。2. 宏的底层定义在虚幻引擎的源码中TEXT()宏的定义简化为#ifdef UNICODE #define TEXT(str) L##str // 宽字符模式拼接L前缀如TEXT(Enemy) → LEnemy #else #define TEXT(str) str // 窄字符模式直接使用原字符串如TEXT(Enemy) → Enemy #endifL##str是 C 的 “宏拼接” 语法给字符串加L前缀表示宽字符字面量虚幻引擎默认启用UNICODE宏因此TEXT(XXX)最终会被解析为宽字符字面量LXXX。二、TEXT()的使用场景1. 适配虚幻引擎的TCHAR类型虚幻引擎的核心字符串类型如FName、FString、FText均基于TCHAR实现因此定义字符串字面量时必须用TEXT()否则会出现 “char*无法转换为TCHAR*” 的编译错误。例如// 正确TEXT()将字符串转为TCHAR类型匹配FName的构造函数 FName TagName FName(TEXT(Enemy)); // 错误直接传入char*类型与TCHAR*不兼容虚幻默认Unicode模式下 // FName WrongName FName(Enemy);2. 跨平台 / 多语言兼容使用TEXT()后字符串会自动适配目标平台的字符编码无需手动区分 “宽字符 / 窄字符”尤其适合需要支持中文、日文等多语言的项目。三、与TEXT()相关的常见宏为了处理不同字符类型的转换虚幻引擎还提供了辅助宏TCHAR_TO_ANSI将TCHAR*转为char*窄字符ANSI_TO_TCHAR将char*转为TCHAR*宽字符TCHAR_TO_UTF8将TCHAR*转为 UTF-8 编码的字符串。FString FStr TEXT(测试); // 将TCHAR类型的FString转为UTF-8字符串 const UTF8CHAR* Utf8Str TCHAR_TO_UTF8(*FStr);
延伸阅读

更多相关文章

2026/9/22 3:13:59

设计模式 08 · 装饰器模式

上一篇代理模式结尾,我们埋了个钩子:代理和装饰器模式(Decorator) 代码结构几乎一样,但意图相反——代理管"控制",装饰器管"增强"。这一篇就来把装饰器讲透,顺便从另一头把这条界限夯实。 装饰器要解决的问题,一句话:在不修改原对象、也不靠继承的前提下,…

2026/9/20 0:08:26

设计模式 07 · 代理模式

从这一篇开始,我们离开"对象怎么造出来"(创建型),进入结构型模式——它们关心的是另一件事:已经造好的类和对象,该如何组合、连接、搭配,才能既满足需求又保持松耦合。 结构型七个模式,几乎都是在玩"包装"和"组合"的艺术。我们从其中实战出镜率最…

2026/9/21 9:43:09

Reia数据库架构揭秘:Turso如何支持离线与在线数据同步

Reia数据库架构揭秘:Turso如何支持离线与在线数据同步 【免费下载链接】Reia RPG game action-adventure MMO built with Godot and Rust. 项目地址: https://gitcode.com/gh_mirrors/re/Reia Reia作为一款基于Godot和Rust构建的动作冒险MMORPG游戏&#xff…

2026/9/24 19:21:52

热点新闻推荐系统毕设全栈实战:Django+Vue+深度学习

每年毕业季,我都会遇到一批被“推荐系统”这个题目吸引的同学,热点新闻推荐系统又是其中最常见的一款。选这个题的人多,但真正能把它做明白的不多——多数人不是不会调模型,而是不知道整个项目该怎么闭环:数据从哪来、…

2026/9/24 19:21:52

Markdown文件打开与编辑全攻略:从查看器到专业编辑器

1. 从“打不开的.md文件”说起:这个格式到底是什么来头很多人第一次遇到.md文件,场景都差不多:从某个项目仓库里下载了一份说明文档,或者同事发来一个压缩包,解压之后发现里面躺着一堆后缀是.md的文件。双击&#xff0…

2026/9/24 19:21:52

毕业设计Java JSP校园导航系统SSH源码详解与部署避坑指南

简介:面向Java Web方向毕业设计的SSH框架校园导航系统完整项目,包含后台管理、校园用户与学生用户三大模块,覆盖用户管理、新闻公告、景点信息、留言等功能,适合需要完整源码和论文支撑的高校毕业生及Java初学者参考学习。资源包共…

2026/9/24 19:21:52

pandas数据处理全指南:从入门到实战

1. 写在前面:为什么你一定要学pandas如果你刚接触Python,或者已经写了几天代码准备往数据分析方向走,那pandas一定是绕不开的那个库。我可以直接告诉你一个判断标准:在Python的数据处理生态里,pandas就是那个“事实标准…

2026/9/24 19:21:52

碳足迹可视化实战:从FusionSolar数据接入到绿色云服务器调度

碳足迹可视化这个概念,这两年已经不是“要不要做”的问题,而是“怎么做才能不挨骂”的问题了。我今年内部搞了一个“绿色云服务器管理”的项目,核心是把光伏发电数据和云资源调度打通,用华为FusionSolar当绿电数据源,最…

2026/9/24 19:16:52

IWOA-BILSTM与BILSTM对比:时间序列预测的超参数优化实践

简介:面向时序预测建模与算法对比需求的 MATLAB 开发者,这份资源提供了改进鲸鱼算法优化双向长短期记忆网络(IWOA-BILSTM)与标准 BILSTM 的完整对比实现。资源聚焦迭代次数、隐藏层节点数、学习率与正则化参数四个核心超参数的自动…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码