Steam版「ひぐらしのなく頃に」の本文フォントを変更する

# Steam版「ひぐらしのなく頃に」の本文フォントを変更しよう

**変更前（MSゴシック）**
![fontmod_before.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268663/e2cc033f-4ddf-39fe-0202-7e374496aa26.png)
**変更後（モトヤシーダW3等幅）**
![fontmod_after.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268663/ff4a74dc-ca75-d9f5-c05a-700d89ea6de1.png)


Steam版「ひぐらしのなく頃に」（以下ひぐらし）は本文用フォントにMSゴシックを採用しているのだが、デザインが正直…なとこがある。だがひぐらしのシステムフォントはリソースとして埋め込まれており、自由に変更することは通常できない。

これに対し、海外の有志がリソースファイル変更（mod）の作業をある程度自動化してくれるスクリプトを公開しているのだが、記事が英語の上わかりにくい。そのため改めて概訳の上構成を修正した記事を公開することにした。

※元サイトが日本国内IPからのアクセスをブロックしているため該当記事へのリンクは載せないでおく。
（探せばすぐに見つかると思います）
ブロックの理由は著作権的問題によるものらしいので、この記事で触れる内容もフォント変更に限るものとする。
**もちろんですが、この方法で生成した改造アセットファイルを配布するのはやめてください。**


## 準備

- [Unity 5](https://unity3d.com/jp/get-unity/download/archive)
- [TextMeshPro（アセット版）](https://forum.unity.com/threads/useful-information-download-links.458634/#post-3304434)
- [Python](https://www.python.org/downloads/windows/)
- [UABE](https://github.com/DerPopo/UABE/releases) 
- [ui-editing-scripts](https://github.com/07th-mod/ui-editing-scripts)

Unity 2019 (以降)で生成されたSDF AssetがUABEでは読み込めないので2019以降は使用不可。2018はUABEでこそ読み込めるが、ui-editing-scriptsが未対応のため不可。元記事で使用されているのが5.5.5なので5を選ぶのが無難。
検証では**5.6.7**を使用した。(Githubには2017も対応済みと書かれていたが未検証)

TextMeshProのストアでの配布は終了しているが、必死の検索の結果[**このページ**](https://forum.unity.com/threads/useful-information-download-links.458634/#post-3304434)からDLできることが判明。製作者がアップロードしたものなのでDLすることに特に問題はない。ここではUnity5.5に対応したバージョン **1.0.56.55.0b2**をDLする。

Pythonは最新バージョンで特に問題はないはず。ui-editing-scriptsが動けばよい。
ui-editing-scriptsで使用するのは**TMPAssetConverter.py**のみ。

UABEはアセットファイルに格納されたデータを閲覧・改造できるツールである。
特に問題ない限りはリンク先から最新バージョンをDLしておく。

## 導入

PCにUnity 5、Pythonをインストール。
UABEとui-editing-scripts は適当なフォルダーに配置しておく。
`pip`でPythonに必要なパッケージを導入。

```shell
pip install numpy Pillow unitypack
```

### unitypackがインストールできない場合

※unitypackは依存パッケージとして`decrunch`を指定しているのだが、これがうまくインストールできないことがあるらしく、その場合unitypackのインストールに失敗する。（私の環境でもエラーが出てpipではインストールできなかった）。ui-editing-scriptsではdecrunchを必要としないので、うまくインストールできない場合は依存性を切った[unitypackのフォーク](https://github.com/tellowkrinkle/unitypack)を下記のコマンドで手動インストールしてやればよいとのこと。

```shell
python setup.py install
```

## SDF Assetの生成

ひぐらしのテキスト表示では通常のアウトラインフォントではなく、SDFという特殊な形式のフォントが用いられている。(Unityでは低負荷でテキストにエフェクトをかけられるという特長からよく用いられているらしい)
そのため、ひぐらし本体のリソースファイルにフォントを埋め込む前に、用意したフォントをSDFに変換しておく必要がある。

Unityを起動し、Assets → Import Package→Custom Package…でUnityにTextMeshProをインポートする。
再起動するとWindow メニューからTextMeshProが起動できるようになっている。
下部のプロジェクトフォルダーにはあらかじめフォントファイルを配置しておく。

Window → TextMeshPro → Font Asset Creator と進み**Font Asset Creator**を起動。
適宜設定をして**Generate Font Atlas**をクリック。
設定項目の解説は長くなったため以下に分けて記した。

プログレスバーが右端まで到達するとアセットが保存できるようになっている。保存時の名前はデフォルトの**[Fontname]-[Weight] SDF.asset**のままにしておく。

### Font Asset Creatorの設定

- **Souce Font File**
  元となるフォントを選択する。プロジェクト内のファイルしか選べない。
- **Sampling Point Size**
  文字のサイズを指定する。特に問題なければひぐらしで用いられているものと同じ26でよい。
- **Packing Method**
  フォントのパッキング方法？を選ぶ。Optinumはその名の通り最適化するためかなり時間がかかる。通常はFastでいいと思う。
- **Atlas Resolution**
  アトラス（文字データを載せるキャンバスのようなもの？）の画質を選ぶ。小さすぎると文字が入りきらないため余裕をもって選ぶとよい。
  参考までに「サイズ26、Fast、4096*4096、JIS第二水準まで」の場合、アトラス全体の6割ほどが文字で埋まっていた。
- **Character Set**
  フォントに採用する文字の範囲を選ぶ。ひぐらしではテキストに最適化された日本語用の文字（約3000種類）がSDFフォントに埋め込まれているらしいが、それを特定するのは面倒（一応[調べるスクリプト](https://github.com/07th-mod/ui-editing-scripts/tree/master/scripts/CharacterInfoExtraction)はある）。なので今回は[ここ](https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4)に掲載されているすべての文字を埋め込むことにする。こうすることで文字の記載漏れはおそらく起こらない。
  この場合は**Custom Characters**を選びCustom Characters Listに[UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156)で紹介されている`japanese_full.txt`の中身を貼り付ける。
- **Render Mode** 
  レンダリングのアルゴリズムを選択する。生成されるフォントの品質と生成にかかる時間はトレードオフなので注意。時間をかけてもいいならDistance Field 32を選ぶ。
- **Get Kerning Pairs?** 
  カーニングペアの設定をするかを決める。チェックを入れといて特にデメリットはないのでチェックする。

## AtlasとMonobehaviourの抽出

UABE(AssetBundleExtractor.exe)を起動する。
File→OpenでAssetファイルを開き、Assetファイル内から必要なデータ3つを抽出する。

### new~.dat

![fontmod_new.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268663/9274d29c-0880-efcb-df28-925ed4f60978.png)
生成されたSDF Asset（**[Fontname]-[Weight] SDF.asset**）をUABEで開く。
3つのデータが格納されているが、今回使用するのはそのうちの2種類。

- Texture2D [Fontname] SDF Atlas
- Monobehaviour

それぞれ`Export Raw`で抽出する。
名前は次のステップ用にそれぞれ**”newAtlas.dat”**、**"newMonoBehaviour.dat"**にしておく。

### old~.dat
![fontmod_old.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268663/9a52c921-f679-02db-e895-1473968de4d6.png)

同様に、ひぐらし本体のAssetsファイルからもフォントデータを抽出する。
ひぐらしのゲームデータ：
`\SteamLibrary\steamapps\common\（ひぐらし本体ルートフォルダ）\HigurashiEp0X_Data`
に格納されている**sharedassets0.assets**をUABEで開く。(HigurashiEp0X_DataのXには章番号が入る)

画像のように内部データがずらっと表示されるが、その中から

- MonoBehaviour msgothic_0 SDF

を選んで`Export Raw`で抽出する。
名前は**"oldMonoBehaviour.dat"**にしておく。

## TMPAssetConverter

前の節で抽出した

- **newAtlas.dat**
- **newMonoBehaviour.dat**
- **oldMonoBehaviour.dat**

に加えて、ui-editing-scriptsに同封されている**TMPAssetConverter.py**を同一のフォルダに配置する。さらに同じフォルダに出力ファイルを書き出すフォルダ：`outputFolder`を作り、その上で以下のコマンドを実行する。

```shell
python TMPAssetConverter.py newAtlas.dat newMonoBehaviour.dat oldMonoBehaviour.dat outputFolder
```

成功すれば、outputFolderに

- **msgothic_0 SDF Atlas_Texture2D.dat**
- **msgothic_0 SDF_TextMeshProFont.dat**

の2種類のファイルが出力されているはずである。

## sharedassets0.assetsの書き換え

**msgothic_0 SDF Atlas_Texture2D.dat**と**msgothic_0 SDF_TextMeshProFont.dat**を使って
内部データファイル`sharedassets0.assets`を以下の手順で書き換える。
あらかじめsharedassets0.assetsはバックアップしておく。

フォント変更用のsharedassets0.assetsをUABEで開き、

1. MonoBehaviour msgothic_0 SDF を選ぶ。
2. 選んだ状態で`Import Raw`をクリックする
3. **msgothic_0 SDF_TextMeshProFont.dat**をインポート。

msgothic_0 SDF Atlasについても同様に行う。

1. msgothic_0 SDF Atlas を選ぶ。
2. 選んだ状態で`Import Raw`をクリックし
3. **msgothic_0 SDF Atlas_Texture2D.dat**をインポート。

うまくインポートできていればModifiedの欄にアスタリスク（**＊**）が付いているはずである。

このままsaveすると書き換えられたsharedassets0.assetsが出力される。これを元のフォルダ：
`SteamLibrary\steamapps\common\（ひぐらし本体ルートフォルダ）\HigurashiEp0X_Data\`
に配置することで、冒頭の画像のようにフォントを置換してひぐらしを楽しむことができる。

## 補記：テキストの見た目調整方法

フォントのカーニング設定等でMSゴシックより1行あたりの文字数が減ると、行数が増えてテキストがウィンドウ外にはみ出してしまうことがある。そのときは、ひぐらし本体の設定ファイルを所定の場所に置くことでテキストの表示を変更できる機能を利用しよう。

`\（ひぐらし本体ルートフォルダ）\StreamingAssets\Scripts`を開くと、大量のシナリオテキストファイルの中に混じって**init.txt**という名前のファイルがある。

このinit.txtの
`SetCharSpacing(); SetLineSpacing(); SetFontSize();`などのパラメータの()内の数値を適当な値に編集する。
編集前に**バックアップ**をとっておく。

編集済みinit.txtを`\（ひぐらし本体ルートフォルダ）\StreamingAssets\Update`に配置した状態でひぐらしを起動すると、本文テキストの見た目が変更されているはずだ。

# ダイマ

鬼隠し編は2020年7月現在無料でDL可能です。
(https://store.steampowered.com/app/310360/Higurashi_When_They_Cry_Hou__Ch1_Onikakushi/)

Steam版のひぐらしはノベルゲーにありがちな選択肢による分岐が全くありません。
なので選択肢に戻るという作業をせずに、一気に読み進めることができます。
そしてSteam版をプレイすれば、アニメ版だけでは描かれていない場面やカットされた重要な情報が数多くあることがわかります。

まだひぐらしの中身を知らない方も、アニメだけご覧になった方も、この機会に続編を含めて是非プレイされることをおすすめします。まとめ買いの場合、以下のリンク先のバンドルで購入するのがお得です。https://store.steampowered.com/bundle/709/Higurashi_When_They_Cry_Hou/

#  参考ページ

- [UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156)
- [Github 07th-mod/ui-editing-scripts](https://github.com/07th-mod/ui-editing-scripts)