
本指南旨在解决使用TextMesh Pro的Unity游戏中出现的日文显示为□的乱码问题,以《霓虹深渊》为例,说明替换字体的方法。 首先 Unity游戏切换为日文游玩时,经常会看到文字显示为□,这是因为游戏内字体不包含相应文字。 但即使向开发者报告,也不一定会修复,就算修复了,也可能还有其他文字存在乱码。 毕竟要支持非母语文字确实有难度,所以也没办法。能提供日文文本我已经很感激了。不过如果出现乱码的话,就没法正常游玩了……结果往往很难如预期那般,而且逐一和别人交流也很麻烦。还是自己动手替换字体吧。这是为有这种想法的人准备的指南。但这个操作复杂且耗时,所以完全不推荐。以下是注意事项: 本指南不会说明工具的安装方法和基本使用方法等细节内容。这些部分需要你自己去补充。除非另有说明,否则文中所写的文件路径均以游戏安装文件夹为根目录。 本指南仅基于最基础的知识编写,可能存在错误。 尤其是关于Unity部分,完全没有进行过深入研究,建议大家带着怀疑的态度阅读。 日语显示为□的文字化原因 游玩Unity制作的日语游戏时,有时会出现如下方图片所示的文字显示为□的情况。

这可能是由于游戏内的字体资源中未包含相应文字导致的。 以下为详细说明。 《霓虹深渊》会像下图所示,使用名为TextMesh Pro的对象的文本粘贴功能来显示文字。

并且,粘贴的文本是通过从ttf等字体文件中提取的字体资源来显示的。 字体资源由以下两部分构成:一是汇集了文字的图像文件,称为字体图集;二是文本文件,其中记录了字体大小等设置值,以及某个文字在该图像中所处坐标位置的字形表。

这个字体图集仅包含制作字体资源时指定的文字,因此如果尝试显示其中不存在的文字,就会输出□来代替文字。也就是说,出现□这种乱码的原因,似乎是在接收到日文文本后,省略了将文本中包含的所有文字列出并重新制作字体资源的步骤。明明看起来不是那么复杂的工序,为什么不做呢?下面将说明代替开发者制作包含日文文本所有构成文字的文本资源并进行替换的方法。使用工具说明 AssetStudio 由于逐一提取文件并查看内容比较麻烦,因此通过AssetStudio的预览画面进行确认。 此外,该工具无法导入已创建的文件。 UABEAvalonia 通称UABEA。 用于资产文件的提取和导入。 Il2CppDumper 用于创建提取资产文件所需的DLL。 如果游戏文件夹中原本就存在类似【NeonAbyss_Data Managed】这样的Managed文件夹及其内的DLL,则不需要此工具。 也就是说,像【霓虹深渊】这样的游戏就不需要,因此不再详细说明。虽然没有尝试过,但似乎是按照以下步骤使用的。 运行Il2CppDumper.exe。 在最初打开的对话框中选择"GameAssembly.dll"。 在第二个打开的对话框中选择"游戏的项目名_Data il2cpp_data Metadata global-metadata.dat"。 Il2CppDumper所在的文件夹会创建DummyDll文件夹,将其重命名为Managed。 将创建的Managed文件夹移动到"游戏的项目名_Data"中。 用于创建替换的字体文件。 合适的文本编辑器 合适的日语字体 我觉得什么都可以,但暂时用森泽的BIZ UD明朝。选择此字体的原因有两点:一是收录的文字数量多,二是其采用宽松的"SIL Open Font License, Version 1.1"许可证,因此可以放心使用。 调查 在此调查替换字体所需的各种信息。 开发所使用的Unity版本 无论哪个level都可以,例如用文本编辑器打开"NeonAbyss_Data level0",可以找到如下类似游戏开发所用Unity版本的字符串。

这种情况下似乎是“2018.4.21f1”,所以请从【unity3d.com】安装该版本的Unity。 使用AssetStudio打开日语字体资源,调查日语字体资源的位置。 另外,首次选择MonoBehaviour时会显示“Select Assembly Folder”对话框,请选择“NeonAbyss_Data Managed”。

如果在此处选错文件夹,就会像下图所示出现【Error while read type】错误,导致无法正常预览和提取。

调查结果确认,相关内容存在于【NeonAbyss_Data resources.assets】中。

配置文件的名称是JP_35px_Winds,但字体图集的名称却是JP_Winds_35px Atlas。不过这不一定是问题,就算有问题也好像解决不了,所以暂时先不管了。这个字体资源在打开"NeonAbyss_Data level4"等内容时也能找到。

不过资产的PathID也相同,另外在AssetStudio中选择目标资产并右键点击,选择"Show original file"后会显示"NeonAbyss_Data resources.assets",因此推测level4可能只包含对resources.assets中字体资产的引用。 因此,本次仅将resources.assets作为替换对象。 进一步查看配置文件的characterSequence,发现只有JP_35px_SourceHan中不包含显示为□的金币的“貨”字,所以决定只替换该字体资产。

字体资源的提取 首先使用UABEA将字体资源的MonoBehaviour和Material转换为文本并提取。 首先用UABEA打开【NeonAbyss_Data resources.assets】。 此时如果【NeonAbyss_Data Managed】及其中的DLL不存在,似乎无法正常打开,但由于存在,所以没有问题。 如果不存在,似乎需要使用Il2CppDumper创建Managed文件夹。 用UABEA打开后会显示资源列表,选择字体资源的MonoBehaviour和Material,点击【Export Dump】即可转换为文本并提取。

本次虽然不会特别使用,但选择字体图集并按下“Export Raw”后,可直接提取数据而不进行加工。

如果还想将字体图集作为图像文件提取,请按下【Plugins】。
然后选择“导出纹理”并点击“确定”。 提取完成后,打开从MonoBehaviour转换的文本JP_35px_SourceHan-resources.assets-387.txt,搜索“FontAssetCreationSettings”,并记录其下方的pointSize、padding、atlasWidth、atlasHeight数值。

此次数值如下: pointSize = 35 padding = 2 atlasWidth = 2048 atlasHeight = 2048 另外,选择字体图集并按下【Plugins】后,选择【Edit texture】打开对话框,确认各项设定值。

创建替换用字体资源 首先在游戏开发版本的Unity中创建并打开3D模板的新项目。

在下方的“Project”选项卡中打开“Assets”文件夹,然后将需要使用的字体文件(仅支持otf或ttf格式)通过拖放方式添加进去。
接下来我想添加游戏日语文本中包含的所有文字的列表文件,但我找不到《霓虹深渊》的日语文本在哪里。因此,我决定使用他人公开的游戏等场景中使用的日语文字列表文件。这个文件也通过拖放添加到Assets文件夹中。
添加后选择菜单 -> "Window" -> "TextMeshPro" -> "Import TMP Essential Resources"。 这样,使用TextMeshPro时必需的文件将被导入到项目中。
接下来选择菜单 -> "Window" -> "TextMeshPro" -> "Font Asset Creator",输入以下数值并点击"Generate Font Atlas"。 "Source Font File"指定要使用的字体文件。 "Sampling Point Size"选择"Custom Size",输入之前确认的pointSize值35。 "Padding"输入之前确认的padding值2。 "Atlas Resolution"由于本次使用的文字数量较多,因此与之前确认的atlasWidth、atlasHeight不同,指定为4096, 4096。 "Character Set"选择"Characters from File"。 "Character File"指定要使用的日语文字列表文件。 勾选"Get Kerning Pairs"。其他设置值设为默认。
之后请按下【Save】保存字体资源。

然后点击“Assets”文件夹中保存的字体资源右侧的箭头将其打开,选择打开后显示在右侧的Atlas。接着在右侧的“Inspector”选项卡中,将“字体资源的提取”部分的设置值调整为在“Edit texture”对话框中确认的数值。在这种情况下,需将“Filter Model”指定为Point。

菜单 -> "游戏对象" -> "3D对象" -> "文本 - TextMeshPro",选择后添加文本对象。

然后在右侧的【Inspector】选项卡中,依次展开【Text Mesh Pro (Script)】->【Main Settings】->【Font Asset】,指定刚才保存的字体。通过在项目中实际使用字体,资源会被整合到资源包中。
菜单 -> "文件" -> "生成设置..."
然后按下【build】按钮,会创建【项目名称_Data】文件夹,其中将保存包含字体资源的资源包。

最后使用UABEA打开“项目名_Data resources.assets”,参考“字体资源提取”部分,将MonoBehaviour和Material转换为文本,并将字体图集分别提取为图像文件。
进行可嵌入替换用字体资源的加工处理 首先创建嵌入用字体资源的MonoBehaviour文本。 由于基础是原始字体资源,因此在这种情况下,用文本编辑器打开JP_35px_SourceHan-resources.assets-387.txt(以下简称原始文本)。 首先将嵌入用字体资源的MonoBehaviour文本(以下简称嵌入文本)中【FaceInfo m_FaceInfo】的m_PointSize行及以下内容,通过复制粘贴覆盖到原始文本中。

同样,将“Array m_GlyphTable”和“Array m_CharacterTable”的所有内容从内置文本复制粘贴,覆盖为原始文本。 接下来,将“Array m_UsedGlyphRects”和“Array m_FreeGlyphRects”的所有内容从内置文本复制粘贴覆盖,但注意不要误改位于“Array m_CharacterTable”和“Array m_UsedGlyphRects”之间的“Array m_AtlasTextures”和“Array m_AtlasTextureIndex”。 然后,将“int m_AtlasWidth”“int m_AtlasHeight”以及“FontAssetCreationSettings m_CreationSettings”中的pointSize、padding、atlasWidth、atlasHeight修改为内置文本中的值。 在这种情况下,这些值均为4096。


最后将"FontAssetCreationSettings m_CreationSettings"的characterSequence值从内置文本复制粘贴覆盖为原始文本并保存。

上述操作完成后,接下来需要制作嵌入式字体资源的材质文本。 不过,据说在这个材质文本中需要将“_TextureHeight”和“_TextureWidth”的值改写为嵌入式材质文本的值,但《霓虹深渊》的材质文本中没有这些项目,所以决定不做任何处理。 如果手动操作觉得麻烦的话,可以查找相关程序来使用。 嵌入替换用字体资源 首先用UABEA打开“NeonAbyss_Data resources.assets”。然后会显示资源列表,请选择字体资源的MonoBehaviour,点击【Import Dump】,在弹出的对话框中选择前一节处理过的JP_35px_SourceHan-resources.assets-387.txt。
接下来是导入材质文本,但这次没有进行修改,所以也不导入。之后在UABEA中选择字体图集,按下“Plugins”后选择“Edit texture”,会打开一个对话框。

在此处按下“Load”按钮会再次打开对话框,请选择用于替换的字体图集图像文件BIZUDMincho-Regular SDF Atlas-sharedassets0.assets-4.png,然后按下“Save”按钮。

最后在菜单中选择“文件”->“保存”,指定保存位置后,即可生成替换后的resources.assets文件。

此外,此时的保存位置必须指定为“NeonAbyss_Data resources.assets”以外的位置。因为UABEA正在运行中。

动作确认:将替换后的resources.assets覆盖到【NeonAbyss_Data resources.assets】,启动游戏,若未出现任何错误,则字体替换完成。接着继续游戏,尝试进入之前文字显示为□的部分……

已确认“金貨”的“貨”字显示正确。 最后 本次说明了在Unity制作的游戏中,通过替换字体来修正显示为□的文字的方法。 但此方法仅适用于使用TextMesh Pro显示文字的游戏,对于同样是Unity制作但直接使用字体文件显示的游戏则无效。 关于日语字体的烦恼似乎还有很多……
2026-02-19 19:00:08 发布在
霓虹深渊
说点好听的...
收藏
0
0
