RPG Maker Uniteで実行バイナリサイズ削減チャレンジ

RPG Maker Unite はUnity上で動くため、スマホ向けのビルドも比較的簡単()にできます。
ただ、Android 向けとして Google Play にアップロードするには、最低でもダウンロード時のバイナリサイズを150MB以下にする必要があるため、実際のところどこまでバイナリサイズを削れるのか試してみました。
参考:https://support.google.com/googleplay/android-developer/answer/9844279
※大きいサイズのバイナリでも、内部リソースを AssetBundle 化して Play Asset Delivery を使ってアップロードする方法もあるようですが、やり方をよく知らない&そのあたりは公式に対応してほしいのでここでは言及しません。

なお、以下で行う内容は、最悪プロジェクトやゲームが壊れても良いのでとにかくどこまでサイズ削減できるかを優先しています。よってこの方法で作ったゲームがまともに動く保証はありません(というか動かないと思う)。
そのあたり、予めご了承ください。
※もし真似したい酔狂な方がいるなら何が起きても自己責任で。バックアップは必須です。自作データが既にあるプロジェクトで行うのは危険なのでやめたほうがいいです。

1:基本アセットのみのプロジェクトを用意する
ツールバーの一番左のボタンが新規プロジェクト作成ボタンなので、それを押して「基本アセットのみ」を選んでプロジェクトを作成します。
※「サンプルゲーム全部」の方はとにかくデータが大きい&重いため

2:最低限の設定をする
とりあえずタイトルから先の動作確認用に以下だけ行いました。
・バトルの編集>戦闘シーンで「フロントビュー」を選択(後の工程でサイドビュー用画像を削除する為)
・キャラクター>初期パーティ設定で適当なキャラを主人公にする
・あとで残す予定のマップチップだけを使って小さなマップを作る
・作ったマップを初期位置として主人公を配置する
・イベントで適当なキャラをマップに配置し、話しかけることができるようにする
・ここまでをUnite上でテストプレイし、正しく動くことを確認する
#面倒だったのでマップへの敵の配置はしませんでした。よってバトルの動作確認はできない状態です。

※この時点でAndroidビルドすると、約700MBのバイナリサイズになりました。

3:削除可能なデータを削除する
データベースに始めから用意されているデータを可能な限り削除していきます。
以下のものは名前を右クリック>削除で消せます。
※間違えて消しても元に戻せないので注意。

・キャラクター>アクター:2人残して残りを削除(本来は最低でも4人残すのを推奨。理由は後述)
・キャラクター>NPC:全削除
・キャラクター>乗り物の編集:全削除
・バトルの編集>敵キャラ:ゴブリンだけ残して残りを削除
・バトルの編集>敵グループ:ゴブリンを含む2つだけ残して残りを削除
・バトルエフェクト:1つ残して削除(データが重そうだったため。バトルを残したいなら安易に削除しないほうがいいかも)
・素材管理>キャラクター>歩行キャラ:残したキャラクター以外を全削除
・素材管理>キャラクター>オブジェクト:全削除
・素材管理>SV戦闘用>アクター:全削除(SV戦闘画面使わないならおそらく問題ない)
・素材管理>SV戦闘用>武器:全削除(SV戦闘画面使わないならおそらく問題ない)
・素材管理>バトルエフェクト:1つ残して残りを削除
・マップ設定>タイルグループ:最初に作ったマップで使ったタイルグループのみ残して残りを削除
・マップ設定>マップリスト:最初に作ったマップを残して残りを削除

ちなみに、キャラクター>アクターを4人未満にしてしまうと、データベース>初期設定>UI設定>バトルメニュー>メインが確認できなくなります。
#UnityEditor側のConsoleにエラーログが表示され、メイン画面の設定もできなくなります。
あとから追加して4人以上にすれば、また確認できるようになります。

4:サイズの大きなサウンドファイルの設定を変更
手順の詳細は省きますが、UnityEditor側のProjectウィンドウで、全てのAudioClipのQuality設定をAndroidのみ100->25に変更してみました。
#これで音質は落ちますが、サイズは削減されるはず…

5:公式アドオンで不要ファイルを削除
以下からDLできる公式アドオンの「UnusedAssetFileRemover」を使って不要ファイルを削除しました。
https://rpgmakerunite.com/downloads/add-ons/
※なお、これを使うと、オプションメニュー等の数値を上下するボタンのDisable状態の画像が不要ファイルと認識されて削除されるため、オプションメニューのボタン表示がおかしくなります(押せない状態のときに白い四角で表示される)。だめじゃん……

※この時点でAndroidビルドすると、約300MBのバイナリサイズになりました。大分減ったけどまだまだです。

6:サンプルマップを削除する
調べたところ、どうもサンプルマップのデータが丸ごとバイナリに含まれているっぽかったので、削除しました。
ただ、この時点では公式アドオンの「MapsTileGroupsRemover」に気づいておらず、独自のやり方で削除しています。
私は以下のフォルダ配下のファイルをすべてプロジェクト外へ退避することで削除しました。
Assets\RPGMaker\Storage\Map\JSON\MapSample : json形式のデータファイル
Assets\RPGMaker\Storage\Map\SampleMaps : prefab形式のデータファイル
もちろん「MapsTileGroupsRemover」を使った方がサンプルマップを削除するには簡単だと思います(実際にサンプルマップのデータを削除するには、このアドオンを使った後で、別途「UnusedAssetFileRemover」を実行してさらに削除する必要があるようです)。ただこのアドオン、タイルグループや自作のマップも削除できるので、まちがって必要なものを削除しないよう注意したほうがいいです(私はアドオンでのサンプルマップの削除のみ試し、他の削除は怖くてやってないです)。

※この時点でAndroidビルドすると、約200MBのバイナリサイズになりました。うーんあともう少し!

7:一部の画像をSpriteAtlas化してみる

※2023/6/24追記:SpriteAtlas化は安易に行わないほうがいいかもしれません。特にプレイヤーキャラクタやオブジェクト用のアニメーションが含まれる画像を含めてしまうと、表示がおかしくなるようです。この時は何故うまくいったのか不明……。なお、既にリリース済みの『ユニテのひみつ』ではSpriteAtlas化は結局うまくいかなかったので利用していません。利用しなくてもAndroidでリリースできるサイズまで削ることは可能でした。
この辺うまく適用できたのか微妙なので詳細は省きますが、Storage/Image配下の画像を以下の手順でSpriteAtlas化してみました。
・ProjectSettings>Editor>Sprite Packerで Modeに V2を選択
・Storage配下にSpriteAtlasを新規作成し、Storage/Imageフォルダを指定してアトラス化

※この時点でAndroidビルドすると、明らかにAtlas画像の分だけサイズが増えた感じになりました。バイナリの内部で画像が重複してるっぽい…?

8:Addressable Asset の重複をチェックし最適化する
バイナリファイルの中を調べると、サイズが大きいのはWindowとかMenu系のPrefabファイル群で、6~7MBくらいあるのが20ファイルくらいあってそれがサイズ増大に影響しているようでした。
そこで、Prefabデータの中に一部の画像が何かのデータが取り込まれているのではと考え、さらに調べたところ、Prefab系のファイルが Addressable Asset Systemのデータとして管理されているらしいことが分かりました。
さらに調べたところ、Addressable Asset Systemでは、データの重複をチェックしたり、重複を取り除くツールがあることがわかりました。
そこで以下のサイトを参考にして、バイナリの中で重複していそうなファイルの最適化(AnalyzeしてFix)を行ってみました。

【Unity】AddressableAssetSystemでSpriteAtlasを使用する
https://tsubakit1.hateblo.jp/entry/2019/03/31/233002

※実際の手順としては、UnityEditorのメニューから、Window>Asset Management>Addressable>Analyzeを選択し、出てきた画面で Analyzed Rules>Fixable Rulesを選択後「Analyze Selected Rules」を押してチェック、重複が見つかったらそのまま「Fix Selected Rules」で修正

その後、さらに公式アドオンで不要なファイルを削除しました。

※この時点でAndroidビルドすると、70MB台のバイナリサイズになりました。やったー!!!

9:SpriteAtlasを調整する

※2023/6/24追記:7の方に書いてますがSpriteAtlas化は安易に行わないほうがいいかもしれないです。
最初に作ったSpritAtlasには、タイトル画像などあまりAtlasには含めたくない画像が含まれていたので、Imageフォルダ配下の一部のフォルダ(UIとかSystem系)のみをAtlas化するように修正しました。

※この時点でAndroidビルドすると、80MB台のバイナリサイズになりました。ちょっと増えたけどまあよし。

バイナリサイズ削減チャレンジ

バイナリサイズ削減チャレンジ結果

結論
限界ぎりぎりまでデータを削ることにより、バイナリサイズを100MB以下まで落とすことができました。
逆に言えば、データが空っぽの状態のプロジェクトを作り、そこから少しずつデータを自分で登録していくことで、バイナリサイズを調整しつつ(Google Playにアップロードできるような小さいバイナリサイズの)ゲームが作れるのではと思います。

ただ本格的なゲームとなると、どうしても画像データが増えるので、実際に150MB以下に抑えるのは厳しそうですが…
このあたりは、公式に何らかの対応をしてほしいところです。
「基本アセットのみ」でもデータがかなり含まれているので(それはツクールの在り方としては良いことだと思いますが)、「最低限のデータのみ」でプロジェクトを新規作成できたりしたら(自分でイチからデータを用意したい人向けにも)良いのではと思います。

また、現在の公式アドオン「UnusedAssetFileRemover」は、未使用と認識されたファイルが(本来必要なものであっても)削除されてしまい、元に戻せないので、使用には十分注意してください。
「UnusedAssetFileRemover」を使う際は、Gitでソースを管理していつでも復元できるようにしておくとか、事前にバックアップを取るなどの対応をあらかじめしておいた方が良いと思います。
#ちなみにUniteで新規作成したプロジェクトには「.gitignore」が含まれていますが、なぜか「Assets/RPGMaker/Storage」が管理対象外フォルダとして設定されているので、Gitで管理したい場合はこちらも注意が必要です。一応確認しましたが、キャラを作ったりイベントを追加したりするとStorage配下に変更が加わるため、コメントアウトしておかないと、差分が検出できません。

-

ちなみに、上の手順で「できる限りデータを削除した環境」では、プロジェクトを開く動作などがかなり軽くなります。
UIリフレッシュにかかる時間がかなり短縮されるため、いろいろ検証する環境として重宝しています(ゲームを作っていくベース環境としては厳しいですが...)。
なので、ゲーム制作を快適に行うために、軽い環境を整備するノウハウが蓄積されていくといいなあと思っています。
#おそらく公式アドオンのサンプルマップを削除するものも、基本アセットのみから不要なものを削除して動作を軽くする目的で作られたのでは……と想像しています。