【詳細②】Steam版 The Room 4: Old Sins 日本語化(自動翻訳化)

こちらは詳細内容の記事です。必要ファイルのダウンロードおよび手順を知りたい方は下記記事をご覧ください。
下にも記載したとおり、TheRoom4の日本語化(自動翻訳化)を行うに辺り いろいろと試行錯誤を行いました。
その中で、ゲーム内のリソース(Assets)を書き換えて日本語表示可能なフォントに変更する方法も試し成功しました。
せっかくなので、その事について まとめておきたいと思います。
なお、この記事の最終的な結果は下記パッチを適用することで得られます。
また、リソースの書き換えについて下記を参考にさせていただきました。

対象フォントの選定

リソース内のフォントをAssetStudioでリストアップ(※)すると8個も見つかりました。
名前 コンテナ
Anton SDF Fonts & Materials
Bangers SDF Fonts & Materials
CaslonAntique SDF  
Electronic Highway Sign SDF Fonts & Materials
LiberationSans SDF Fonts & Materials
Oswald Bold SDF Fonts & Materials
Roboto-Bold SDF Fonts & Materials
TheRoom SDF  
※いろいろな方法があるかと思いますが、私はAssetStudioのメニュー[Export]-[Asset list to XML]-[All assets]でxmlに掃き出しテキストエディタGrepしてリストアップしています。
ちょっと多いのでdnSpyで下記コードをXUnity.AutoTranslator.Plugin.Core.dllへ追加し表示されないフォントは対象外とします。
BepInEx\plugins\XUnity.AutoTranslator\XUnity.AutoTranslator.Plugin.Core.dll
XUnity.AutoTranslator.Plugin.Core.AutoTranslationPlugin.ToggleTranslation

XuaLogger.AutoTranslator.Info("--- START ---");
try
{
    int i = 0;
    foreach (TMPro.TMP_FontAsset f in Resources.FindObjectsOfTypeAll<TMPro.TMP_FontAsset>())
    {
        XuaLogger.AutoTranslator.Info(string.Format("TMPro.TMP_FontAsset[{0}] = {1}", i++, f.name));
    }
}
catch (System.Exception)
{
    XuaLogger.AutoTranslator.Info("Exception!");
}
XuaLogger.AutoTranslator.Info("--- END ---");

※このコードは調査のためだけのコードなのでパッチには含めていません。調査方法を残しておきたくて記事に記載しています。
コードを"Edit Method (C#)..."で追加する際、Compileエラーになる場合があります。
しかし重複に気を付けつつ"Add Assembly Reference (Ctrl+O)"ボタンで下記を読み込めば通るようになります。

BepInEx\plugins\XUnity.AutoTranslator\XUnity.AutoTranslator.Plugin.Core.dll (編集対象)
BepInEx\core\XUnity.Common.dll
BepInEx\core\UnhollowerBaseLib.dll
BepInEx\unhollowed\*
mono\Managed\netstandard.dll

そして、このコードを起動直後のメインメニューで実行した結果は下記のとおりです。

[Info   :XUnity.AutoTranslator] --- START ---
[Info   :XUnity.AutoTranslator] TMPro.TMP_FontAsset[0] = LiberationSans SDF
[Info   :XUnity.AutoTranslator] TMPro.TMP_FontAsset[1] = CaslonAntique SDF
[Info   :XUnity.AutoTranslator] TMPro.TMP_FontAsset[2] = TheRoom SDF
[Info   :XUnity.AutoTranslator] --- END ---

とりあえず、この3個のフォントのみを対象とします。(LiberationSans SDFも未使用な気がしますが表示されているので対象とします)

使用する日本語フォントの選定

どうせなら見た目が近いフォントを使用したいのでそれぞれのフォントについて簡単に調べてみました(個人的な感想含)。
LiberationSans SDF
LiberationSansはLiberationのSans系フォントの意味らしい。
Sans系というのはSans-Serifのことで、セリフ(飾り)が無いって事らしい。ArialやMSゴシックと同類(?)
CaslonAntique SDF
Caslonはセリフ体。その中でもオールド・ローマン体に分類されるらしい。
Antique(アンティーク)は文字通りアンティーク調(?)。『Caslon Antique』で検索すると若干かすれたような見た目のフォントも見つかった。Garamondと同類(?)
TheRoom SDF
TheRoomのために作られたフォント?。セリフ体。トランジショナル・ローマン…のような気がする。
CaslonAntiqueが縦長な文字(長方形)なのに対してこちらは正方形に近い感じ。Centuryに似ている??
上記を踏まえてGoogle Fontsでフォントを探し下記のように決めました。
TheRoom4のフォント 日本語フォント
LiberationSans SDF Noto Sans Japanese (Regular)
CaslonAntique SDF BIZ UDMincho (Regular)
TheRoom SDF Noto Serif Japanese (Regular)

TheRoom4からのエクスポート

対象フォントのTexture2D、MonoBehaviour、Materialがどこにあるかリストアップします。Texture2DはUnityEX、MonoBehaviourとMaterialはUABEAとエクスポートに使用するツールが異なるので別々にまとめると下記となります。このオブジェクトを参考記事に従いエクスポートします。
Texture2D
ファイル名 # オブジェクト名
resources.assets 860 LiberationSans SDF Atlas
resources.assets 865 CaslonAntique SDF Atlas
sharedassets0.assets 6 TheRoom SDF Atlas
MonoBehaviour, Material
ファイル名 # オブジェクト名
resources.assets 8 LiberationSans SDF - Drop Shadow
resources.assets 9 LiberationSans SDF - Metalic Green
resources.assets 10 LiberationSans SDF - Outline
resources.assets 11 LiberationSans SDF - Overlay
resources.assets 12 LiberationSans SDF - Soft Mask
resources.assets 42 LiberationSans SDF Material
resources.assets 43 CaslonAntique SDF Material
resources.assets 3611 LiberationSans SDF
resources.assets 3749 CaslonAntique SDF
sharedassets0.assets 2 TheRoom SDF Material
sharedassets0.assets 83 TheRoom SDF
UnityEX:対象を選択した状態で右クリックし[Export with convert or Raw]を選択
UABEA:対象を選択した状態で[Export Dump]ボタンをクリック。保存先フォルダ選択後に表示される[Select dump type]ダイアログで[UABE text dump]が表示されている状態でOKボタンをクリック。

PointSize,Padding等の確認

エクスポートしたファイルからMonoBehaviourのPointSize, Padding, AtlasWidth, AtlasHeightとMaterialの_TextureHeight, _TextureWidthをまとめると下記となります。
※TheRoom4が使用しているバージョンのTextMeshProにはm_CreationSettingsがないためm_fontInfoからの情報をまとめています。
MonoBehaviour
Name PointSize Padding AtlasWidth AtlasHeight
CaslonAntique SDF 44 5 512 512
LiberationSans SDF 86 9 1024 1024
TheRoom SDF 32 5 512 512
Material
Name _TextureHeight _TextureWidth
CaslonAntique SDF Material 512 512
LiberationSans SDF Material 1024 1024
LiberationSans SDF - Drop Shadow 1024 1024
LiberationSans SDF - Metalic Green 1024 1024
LiberationSans SDF - Outline 1024 1024
LiberationSans SDF - Overlay 1024 1024
LiberationSans SDF - Soft Mask 1024 1024
TheRoom SDF Material 512 512

日本語フォント作成 および ビルド

参考記事に従い日本語フォントを作成します。インストールするUnity、TextMeshProのバージョンはTheRoom4にあわせ下記にします。
Unity 2019.4.5f1
TextMeshPro 1.0.23
Font Asset Creatorの設定値は下表のとおりです。
BIZUDMincho-Regular SDF(CaslonAntique SDF用)
Font Source BIZUDMincho-Regular.ttf
Font Size Custom Size : 44
Font Padding 5
Packing Method Fast
Atlas Resolution 8192 x 4096 ※2
Character Set Characters from File
Character File JpFontText_utf-8.txt
Font Style Normal : 2
Font Render Mode Distance Field 16
Get Kerning Pairs
NotoSansJP-Regular SDF(LiberationSans SDF用)
Font Source NotoSansJP-Regular.ttf
Font Size Custom Size : 32 ※1
Font Padding 5 ※1
Packing Method Fast
Atlas Resolution 4096 x 4096 ※2
Character Set Characters from File
Character File JpFontText_utf-8.txt
Font Style Normal : 2
Font Render Mode Distance Field 16
Get Kerning Pairs
NotoSerifJP-Regular SDF(TheRoom SDF)
Font Source NotoSerifJP-Regular.otf
Font Size Custom Size : 32/td>
Font Padding 5
Packing Method Fast
Atlas Resolution 4096 x 4096 ※2
Character Set Characters from File
Character File JpFontText_utf-8.txt
Font Style Normal : 2
Font Render Mode Distance Field 16
Get Kerning Pairs
※1:LiberationSans SDFの値に合わせればPointSize=86,Padding=9ですが大き過ぎると感じたためTheRoom SDFと同じ値としました。(おそらく使われないフォントですし…)
※2:無条件で最大値(8192 x 8192)にしても良かったかも知れませんが使用メモリ量に多少は影響するかもしれないので収まる範囲で最小の大きさにしました。この時、Font Render ModeをHinted SmoothでAtlasWidth,AtlasHeightを調整し、本番はDistance Field 16でレンダリングすることで多少は時短になりました。
オブジェクトの作成(3個)およびビルドは参考記事のまま特に変更はありません。

自作ゲーム(?)からのエクスポートおよびリネーム

参考記事に従い、ビルドした自作ゲーム(?)から対象フォントのTexture2D・MonoBehaviour・Materialをエクスポートします。また上書きするためにTheRoom4にあわせてリネームします。エクスポートするオブジェクトおよびリネームの対応は下表のとおりです。
オブジェクト名 エクスポートされたファイル名 ※ リネーム後のファイル名
BIZUDMincho-Regular SDF Atlas BIZUDMincho-Regular SDF Atlas.tex.dds CaslonAntique SDF Atlas.tex.dds
BIZUDMincho-Regular SDF Material BIZUDMincho-Regular SDF Material-sharedassets0.assets-4.txt CaslonAntique SDF Material-resources.assets-43.txt
BIZUDMincho-Regular SDF BIZUDMincho-Regular SDF-sharedassets0.assets-10.txt CaslonAntique SDF-resources.assets-3749.txt
NotoSansJP-Regular SDF Atlas NotoSansJP-Regular SDF Atlas.tex.dds LiberationSans SDF Atlas.tex.dds
NotoSansJP-Regular SDF Material NotoSansJP-Regular SDF Material-sharedassets0.assets-3.txt LiberationSans SDF Material-resources.assets-42.txt
NotoSansJP-Regular SDF NotoSansJP-Regular SDF-sharedassets0.assets-11.txt LiberationSans SDF-resources.assets-3611.txt
NotoSerifJP-Regular SDF Atlas NotoSerifJP-Regular SDF Atlas.tex.dds TheRoom SDF Atlas.tex.dds
NotoSerifJP-Regular SDF Material NotoSerifJP-Regular SDF Material-sharedassets0.assets-2.txt TheRoom SDF Material-sharedassets0.assets-2.txt
NotoSerifJP-Regular SDF NotoSerifJP-Regular SDF-sharedassets0.assets-12.txt TheRoom SDF-sharedassets0.assets-83.txt
※環境によって名称が若干変わります。

MonoBehaviour・Materialの書き換え

MonoBehaviour・Materialの内容が自作ゲーム(?)のままなので必要な箇所のみTheRoom4にあわせて書き換えます。参考記事では MultiReplace というツールとその設定ファイルで書き換えられていますが、そのまま使用できないので手動で書き換えます。(_TextureHeight・_TextureWidthのみを書き換えるファイルには利用させていただきました)
参考記事と設定ファイルに同封されていたメモをもとにTheRoom4(TextMeshPro v1.0.23)での変更箇所は下記としました。(下記項目をTheRoom4の値で上書きしていく)
MonoBehaviour
  • ① m_Scriptのm_FileID, m_PathID
  • ② m_Name
  • ③ hashCode
  • ④ materialのm_FileID, m_PathID
  • ⑤ materialHashCode
  • ⑥ m_fontInfo.name
  • ⑦ atlasのm_FileID, m_PathID
対象ファイル
  • CaslonAntique SDF-resources.assets-3749.txt
  • LiberationSans SDF-resources.assets-3611.txt
  • TheRoom SDF-sharedassets0.assets-83.txt
Material
  • ① m_Name
  • ② m_Shaderのm_FileID, m_PathID
  • ③ m_SavedProperties.m_TexEnvs[0~4]のm_FileID, m_PathID
    (ほとんどの項目が0だが_MainTexのみ設定があった)
対象ファイル
  • CaslonAntique SDF Material-resources.assets-43.txt
  • LiberationSans SDF Material-resources.assets-42.txt
  • TheRoom SDF Material-sharedassets0.assets-2.txt
下記MaterialについてはTheRoom4からエクスポートしたファイルをそのままコピーして_TextureHeight・_TextureWidthのみ日本語フォントに合わせた4096x4096へ書き換えます。
  • LiberationSans SDF - Drop Shadow-resources.assets-8.txt
  • LiberationSans SDF - Metalic Green-resources.assets-9.txt
  • LiberationSans SDF - Outline-resources.assets-10.txt
  • LiberationSans SDF - Overlay-resources.assets-11.txt
  • LiberationSans SDF - Soft Mask-resources.assets-12.txt
これには参考記事の設定ファイルが利用できます。
参考記事からダウンロードできる設定ファイルを適用したMultiReplaceで置換リストを[B TMP_FontMaterial]-[2:// H4096W4096]に合わせ上記5ファイルをファイル名にドロップし[置換]をクリックします。

TheRoom4へのインポート

参考記事に従い日本語フォントのTexture2D・MonoBehaviour・Materialをインポートします。
Texture2D
エクスプローラー等でTheRoom4からエクスポートした際にできた下記フォルダ構造を崩さずに、それぞれのファイルを自作ゲーム(?)からエクスポートしリネームしたファイルで上書きします。

  Unity_Assets_Files
    ├─resources
    │  └─Textures
    │      └─res_resources
    │              CaslonAntique SDF Atlas.tex.dds
    │              LiberationSans SDF Atlas.tex.dds
    │
    └─sharedassets0
        └─Textures
            └─res_sharedassets0
                    TheRoom SDF Atlas.tex.dds

その後resources.assetをUnityEXで開いて[Import files]ボタンをクリック。同様にsharedassets0.assetをUnityEXで開いて[Import files]ボタンをクリックすればTexture2Dのインポートは完了です。
MonoBehaviour, Material
resources.assetsまたはsharedassets0.assetsをUABEAで開きます。インポート対象を選択(複数可)した状態で[Import Dump]ボタンをクリック。自作ゲーム(?)からエクスポートし書換を行ったファイルのあるフォルダを選択。その後表示される[Select dump type]ダイアログで[UABE text dump]が表示されている状態でOKボタンをクリック。[Batch import]が表示されるので確認の後OKボタンをクリック。以上で最初に選択したオブジェクトのインポートは完了です。同様の操作を繰り返し下記すべてをインポートします。
ファイル名 # オブジェクト名
resources.assets 8 LiberationSans SDF - Drop Shadow
resources.assets 9 LiberationSans SDF - Metalic Green
resources.assets 10 LiberationSans SDF - Outline
resources.assets 11 LiberationSans SDF - Overlay
resources.assets 12 LiberationSans SDF - Soft Mask
resources.assets 42 LiberationSans SDF Material
resources.assets 43 CaslonAntique SDF Material
resources.assets 3611 LiberationSans SDF
resources.assets 3749 CaslonAntique SDF
sharedassets0.assets 2 TheRoom SDF Material
sharedassets0.assets 83 TheRoom SDF

日本語フォント化完了

以上でTheRoom4の日本語フォント化が完了です。XUnity.AutoTranslatorと組み合わせることで下記のように日本語が表示されるようになります。
ここまでやった後にXUnity.AutoTranslatorでTheRoom4に読み込ませることのできるフォント(AssetBundle)の作成方法がわかりました。
resources.asset#894には"English"という名前のTextAssetがあるので、これを翻訳できればBepinExもXUnity.AutoTranslatorも不要で日本語化ができると思うのですが、私に翻訳はできません。
翻訳サービスを利用するならXUnity.AutoTranslatorが便利で、XUnity.AutoTranslatorを使用するならAssetBundleでの日本語フォント化の方が導入しやすい…と思い、こちらは作っただけでほとんど使用して(遊んで)いません。

ただせっかくなので記事を書かせていただきました。どなたかの そして なにかの参考になれば幸いです。