こちらは詳細内容の記事です。必要ファイルのダウンロードおよび手順を知りたい方は下記記事をご覧ください。
下にも記載したとおり、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ゴシックと同類(?)
Sans系というのはSans-Serifのことで、セリフ(飾り)が無いって事らしい。ArialやMSゴシックと同類(?)
CaslonAntique SDF
Caslonはセリフ体。その中でもオールド・ローマン体に分類されるらしい。
Antique(アンティーク)は文字通りアンティーク調(?)。『Caslon Antique』で検索すると若干かすれたような見た目のフォントも見つかった。Garamondと同類(?)
Antique(アンティーク)は文字通りアンティーク調(?)。『Caslon Antique』で検索すると若干かすれたような見た目のフォントも見つかった。Garamondと同類(?)
TheRoom SDF
TheRoomのために作られたフォント?。セリフ体。トランジショナル・ローマン…のような気がする。
CaslonAntiqueが縦長な文字(長方形)なのに対してこちらは正方形に近い感じ。Centuryに似ている??
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の値で上書きしていく)
参考記事と設定ファイルに同封されていたメモをもとに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ファイルをファイル名にドロップし[置換]をクリックします。
参考記事からダウンロードできる設定ファイルを適用した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での日本語フォント化の方が導入しやすい…と思い、こちらは作っただけでほとんど使用して(遊んで)いません。
ただせっかくなので記事を書かせていただきました。どなたかの そして なにかの参考になれば幸いです。
翻訳サービスを利用するならXUnity.AutoTranslatorが便利で、XUnity.AutoTranslatorを使用するならAssetBundleでの日本語フォント化の方が導入しやすい…と思い、こちらは作っただけでほとんど使用して(遊んで)いません。
ただせっかくなので記事を書かせていただきました。どなたかの そして なにかの参考になれば幸いです。