Heart of Crown Online汉化记录
minimipool
2024年05月18日 12:15

花了几天时间折腾出了皇冠之心OL的汉化方式,趁着还没忘记先写下来,方便以后自己汉化其他U3D游戏能有参考,也方便同样想汉化U3D游戏的朋友参考。

首先是游戏商店链接:store.steampowered.com/app/1883000

还有做好的汉化补丁链接:share.weiyun.com/CpBtsDxT


需要用到的工具AssetStudio、AssetBundleExtractor对应版本的Unity

AssetStudioAssetBundleExtractor在Github下载最新版就行,Unity最好下载跟目标游戏开发所用版本一致的版本。入手难度都不大,这里就不贴链接了。


  • 查看游戏Unity版本号的方式:

来到游戏根目录/XXX_Data文件夹下,找到没有文件后缀的文件(globalgamemanagers、level0、level1都行)

右键,用记事本一类的工具打开查看,可以在前两行一堆奇奇怪怪的字符里边看到非常清晰的一小段文本:

这串很显眼的字符就是unity的版本号了,到unity官网找对应版本下载即可。

*注意:在中文官网默认会下载到国内版(版本号后缀多了个c1的版本),AssetBundleExtractor解析国内版可能会出问题,请移步到英文官网下载


  • 确认游戏目录下的文件:

在使用AssetBundleExtractor之前,我们先仔细看一下Data文件夹下的东西:

随便找个未加密的打包好的unity工程文件对比一下:

可以看到,HEARTofCROWN_Data下少了Managed文件夹,但是多了il2cpp_dataStreamingAssets文件夹

StreamingAssets文件夹存在与否对我们解包没啥影响,这里跳过不详述。

il2cpp_data文件夹的存在则表明游戏文件受il2cpp加密,原本应该塞满.dll文件的Managed文件夹被加密没了,想完整解包的话需要借助到il2CppDumper一类的逆向工具将.dll文件还原出来才行。

这类工具我前面没有列出,因为对皇冠之心ol,用不着这么高端的破解方式。

程序员把BackUpThisFolder_ButDontShipItWithYourGame(备份这个文件夹但是不要跟你的游戏一起发布)一起打包发布出来了:

而消失不见的Managed文件夹,带着它的.dll文件,一起躺在里边等着我们取用:

也顺带给各位游戏开发者们提个醒,想搞加密发布的话,多注意一下这些不该一起带出去的文件,不然会让你的加密变成笑话...

庆幸的是,在这篇(拖了两周多的)专栏文章发布前的某次更新,程序员终于发现了这个文件夹并从发布文件中移除了。(不过这篇文章还是以你能拿到Managed文件夹为前提写的)

总之,我们将Managed文件夹拷贝到HEARTofCROWN_Data文件夹下,这样解包准备就完成了:


  • 用AssetStudio定位所需文件:

打开AssetStudioGUI,左上角File选项展开选择Load file,找到HEARTofCROWN_Data文件夹,打开里面的resources.assets,游戏内用到的资源基本上都能从这里找到。

*注意:打开resources.assets之前先在AssetStudioGUI的菜单栏里选择关闭Debug-Show error message,不然打开过程中会有相当多的报错弹出。

载入完成后切到Asset List栏,点击Type将文件按格式排序,方便我们接下来的查找:

我们的目标是汉化,因此需要找到文件类型是TextAsset的文件。

依次点开类型为TextAsset的项,在工具界面右侧能看到预览,从中判断需要进行汉化翻译的项有哪些。

最终确定,需要汉化的是tips、tutorial和message0:

*注意:虽然我们只打开了resources.assets一个文件,不过AssetStudio把同目录下关联的文件也都一起打开了,因此实际位置可能在别的文件。

右键单个项,在右键菜单点击Show original file可以看到这个文件实际所处的位置。依次确认后能发现,这三个文件都储存在resources.assets里。

记录一下这几个文件的PathID,然后开始找字体文件。

游戏里的字体只支持日文和英文,如果不替换成中文字体的话,汉化后会出现一堆的“口”:

unity常用的字体文件有两种,一种是旧版字体,一种是TextMesh Pro(简称TMP)。

先从常规的字体开始确认,找到Type是Font的文件,能发现只有两个:

Arial是unity自带的默认字体,除非特意删除,不然基本上都会有。而另一个LiberationSans是英文字体,很显然都不是我们要找的。那么,游戏用的字体形式只能是TMP了。

TMP字体有个特点,命名的时候如果不特意改名字,那么文件名必定包含有“Atlas”,所以我们可以直接搜一下看看:

名字带Atlas且格式为Texture2D的这几个就是我们要找的了。在右侧预览窗口一一确认后,能发现只有Matisse Atlas在右侧的预览有日文汉字,另外几个只是英文字体和特殊字符而已,因此可以确定,游戏在日文方面仅使用了Matisse字体,只要把它替换掉就行了。

搜索Matisse,能看到有四个结果,Matisse_ExtraBold Atlas只提供了标点符号,因而我们实际要修改替换的文件只有Matisse和Matisse Atlas。

逐个右键点选Show original file,能看到这两个文件存放在sharedassets0.assets里,这也是我们一会要进行操作的文件。


  • 制作可用的TextMesh Pro字体:

首先来简单介绍一下TextMesh Pro是什么东西。

简单说的话,它就像是一个带有索引的文字图集。引擎将所有可能用到的字符统统放入一张图片里(即上面找到的Texture2D格式的文件),并为这张图片定制了一个索引目录(也就是上面那个MonoBehaviour格式的文件)。当游戏需要用到某个特定字符时,就会根据索引在文字图里找到对应的文字,将它放在需要的地方。

为了能嵌入中文字体,我们需要用unity制作一份中文的TMP字体,将其导出后替换掉原游戏文件。虽说不是太远古的unity都能制作出TMP字体,不过为了减少出错,最好使用跟游戏引擎版本一致的unity版本。

打开Unity Hub,新建空白项目,2D3D都行,项目名随意,确认好引擎版本后打开。

依次选择Window-TextMeshPro-Font Asset Creator,打开Font Asset Creator窗口。第一次打开会弹出资源包导入窗口,直接选Import就行。

-Source Font File里选择一个已经导入到unity的字体。我这里选择的是一个支持中日英三语的开源字体,因为联机对战时候可能会遇到使用平假名或片假名做ID的玩家,如果我替换后的字体不支持日文,那么这些玩家的ID会显示成“口”:

(所以,打完补丁后也请避免使用中文id,不然别人看会是一堆的“口”)

-Sampling point Size和Padding保持默认即可。

-Packing Method选Fast[快速]就行(选Optimum[最佳]会花费非常多的时间)

-Atlas Resolution根据文本量来选,这项决定了最终生成的整合图的分辨率,不需要跟游戏原文件的分辨率一致。考虑到汉字的字体数量大,这里选了最大分辨率8192x8192。

-Character Set选Custom Characters或者选Characters from File,前者是要在下方的框内手动输入需要用到的字符,后者是要将已经存好字符的txt文档导入进来。可以在网上搜常用汉字文档,然后粘贴或导入进来即可。我在这里使用的就是从网上搜到的文档:

当然,为了能兼容日文,我对这个字符集进行了修改。

我将字符集内的汉字复制出来,剔除其余部分。然后将原游戏的TMP文件提取出来,将TMP内的字符(汉字、假名、数字、字母、符号)全部复制出来,跟之前的7000汉字放在一起。

日文汉字有不少是跟中文汉字重复的。因此,我找了个在线网站,将重复的文字筛选剔除,最终得到了一份包含常用中文汉字和游戏中用到的独特日文汉字,以及游戏中用到的所有标点符号的字符集文档。

将文档导入unity,或者将内容复制进来均可,用于告诉unity需要用到的字符有哪些。

-Render Mode选SDF即可。

-Get Kerning Pairs是否勾选影响不大,想勾可以勾一下。

全部准备完成后点击Generate Font Atlas生成,等待进度条读取完毕后点击save,选择合适的位置保存新生成的TMP字体文件(一般默认位置即可)。

注意一下Characters included这项,如果“/”左右两边的数字不一致,说明有些字符没有被整合进图片里。出现这种问题通常都是因为选择的字体不包含某些字符(比如中文字体通常不包含平假名、片假名),系统没法将这部分字符制作出来,因而产生了遗漏,这也是上文说要使用兼容中日英三语的字体的原因。

之后,依次选择[GameObject]-[UI]-[Text - TextMeshPro],创建一个TMP文本物体:

在文本栏随便输入些文字,Font Asset选择刚才制作好的TMP字体,以确保unity导出时候能把需要的字体也一并打包导出(默认不打包未使用的文件)。

依次选择[File]-[Build Settings...],打开工程导出界面。

不需要进行任何改动,直接点击Build然后选取导出路径。

选好要导出的目标文件夹(最好新建一个空白文件夹),之后等待导出即可。


  • 用AssetBundleExtractor提取和导入文本文件:

AssetStudio有导出功能,但没有导入功能。为了替换文件,需要用到AssetBundleExtractor

AssetStudio导出的脚本格式跟AssetBundleExtractor导出的格式有些出入,用AssetStudio导出的脚本用AssetBundleExtractor导入时会报错,因此导入导出都最好在AssetBundleExtractor中进行。

打开AssetBundleExtractor,菜单栏依次选择File-Open,将Data文件夹下除文件夹以外的文件全部选取,然后一次性打开:

会有几个文件打不开,不用理会,打不开的文件我们用不上。

不想看到左下角报错提示的话,可以到View-Progress里,点Clear all来清除全部报错。

虽然不用打开Managed文件夹,不过还是要确保它在文件目录下,提取MonoBehaviour文件时会需要到。

最好将整个Data文件夹(连同放入里面的Managed文件夹)一起备份到别处,然后在别处执行提取、修改操作。

*注意:虽然要修改的文件只有resources.assetssharedassets0.assets,但是文件之间是有关联的,提取和导入可能需要用到另外的文件(比如没有打开sharedassets0.assets.resS的时候,没法从sharedassets0.assets中导出图片),如果相关文件没有在Asset Bundle Extractor中打开,导入导出时会出现问题。最为稳妥的方式便是像这样,将全部文件在工具中打开。

全部打开后,预览界面是这样的:

展开resources.assets,根据之前记下的Path ID找到我们要汉化的三个文本文件,用右侧的Export Dump将它们依次导出,格式选.txt或者.json都行。

找到刚才导出的文件,用记事本或者notepad++打开,将里面的日文文本汉化(记得开启自动换行):

“システム文言”这种标签性质的不用管,它们只是标识下面部分的文本用于哪里,不会在游戏中出现,这类文本没有对应的英文翻译,我们也不需要把它们翻译成中文。

翻译完成并保存后,回到AssetBundleExtractor,选好文件后点开右边的Import Dump,找到翻译好的txt或者json文件,将其导入。三个文件都是一样的处理。

三个TextAsset都导入替换之后,依次点开左上方File-Apply and Save All,将修改后的resources.assets导出到其它地方(此时原本的resources.assets正在被占用,不能直接替换)。

AssetBundleExtractor导出的文件会在文件后缀末尾加上“-mod”,记得手动删掉。

至此,文本翻译就完成了。


  • 用AssetBundleExtractor导出TMP字体相关文件:

重新打开AssetBundleExtractor,同样File-Open,不过这次要打开的是我们之前导出的unity工程文件。

因为内容较少,所以跳过AssetStudio查看这一步。

同之前一样,把Data文件夹下面所有文件夹以外的文件全部选中并打开。之后,展开sharedassets0.assets文件:

Material是管理字体纹理的,因为原版字体纹理没有改动的必要,因此可以无视这个文件。

选中MonoBehaviour格式的文件,点击View Data跳转到文件内容查看标签页,跳出的提示框选择“是(Y)”,之后弹出的定位一律点取消即可。

*这一步是为了让AssetBundleExtractor解析脚本,不经过这步直接Export Dump的话得到的脚本将会是不完整的。最开始弹出的提示框是询问是否要解析,后面弹出的dll定位是因为没有在当前目录的Managed文件夹下找到这几个dll,不过由于解析这个脚本不需要用到这些dll,因此全部取消即可。

【这也是为什么需要将Managed文件夹放入Data文件夹根目录下的原因】

解析完成后回到之前的标签页,再次选中MonoBehaviour文件,用右侧的Export Dump导出,格式选txt或者json都行。

选中Texture2D文件,由于这个是图片文件而不是脚本文件,因此不能直接用Export Dump导出。这里选择Plugins,在下拉列表里选Export to .png,导出png格式的图片:

关闭后再重新打开AssetBundleExtractor(文件全选然后Close也行,甚至不管都行,只是文件多了容易乱)。

按之前的步骤再次打开HEARTofCROWN_Data下的文件,找到sharedassets0.assets文件,然后依之前记录的PathID找到MonoBehaviour格式的文件Matisse:

按上面的方法将Matisse文件导出。

原文件的Texture2D不需要导出,等会直接替换即可。


  • 替换原版TMP字体:

经过上述步骤,我们现在有自己打包的工程文件里提取出来的Texture2D图片和MonoBehaviour脚本,以及从原游戏中提取出的MonoBehaviour脚本:

用记事本或者notepad++之类的记事本工具,打开两个json文件:

将PathID、GUID、HashCode、Name全部从原版json那边复制粘贴过来,注意m_SourceFontFileGUID有两处,用查找功能(ctrl+F)定位下去并修改。

第二处m_SourceFontFileGUID下面些的地方(字体文本下面)有两处GUID,也从原版json那边复制粘贴过来修改:

回到上面,找到m_LineHeight,将其修改为m_PointSize的2倍左右:

这个数值决定了字体行高,会影响字体行间距,太大的话可能会影响美观或是某些地方的文本超出边框之类的,太小的话可能会让字体挤在一起:

由于无法预览结果,只能等导入游戏后根据实际情况进行增减调整。一般最合适的字高都在m_PointSize的两倍附近,因此先以这个数值的两倍为基底,导入游戏后再根据情况进行调整。

回到AssetBundleExtractor,将修改好的json文件用import Dump导入,替换原本的Matisse。替换用的json文件不需要改名,保持之前的名字就好(让系统识别的Name已经改好了)。

找到要改的Texture2D,选择Plugins下拉菜单的Edit,打开图片修改界面:

不需要改动任何参数,直接点最下方的Load,找到之前导出的png图片,然后点OK即可。

全部修改好之后,再次用File-Apply and Save All将修改后的sharedassets0.assets导出到其它位置,记得删掉后缀多出的“-mod”。


  • 汉化补丁成品:

经过一番折腾后,我们得到了AssetBundleExtractor导出的resources.assetssharedassets0.assets,将它们替换游戏同名文件,进入游戏,享受汉化后的成果吧: