テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】1GB近かったPC向けゲームのアプリサイズを18MBぐらいまで縮めた話

グローバルゲームジャム2016で、NPCに紛れたプレイヤーを見つけ出すゲーム「Creep IN Heresy(邪教に忍び込め!)」を作った話 -で少し書いた、アプリサイズを少し小さくした話です。

これはTipsと言うよりは、単純に作り方が間違ってたので凄いサイズになり、それを直したらアプリサイズが小さくなったというお話ですので、過度な期待はしないでよんでくだしあ。

巨大なアプリサイズの正体はテクスチャ

今回作ったゲームの中で最も巨大なデータは、テクスチャでした。デザイナーの方は特に気にせず「高解像度なムービーをスプライトとして渡してきた」ため、何か凄い事になってしまっていたという訳です。ぶっちゃけ、980MBのうち殆どのデータがこのスプライトアニメーションです。
どのぐらい大きいかは、Inspectorをテクスチャで見れば確認出来ます。

f:id:tsubaki_t1:20160204220653j:plain

f:id:tsubaki_t1:20160204220707j:plain

f:id:tsubaki_t1:20160204230142g:plain

こんなノリで大量にプロジェクトに含まれていたテクスチャが1枚につき2MBから3.5MBもあるデータをフルカラーで格納していたため、ゲームサイズが凄い事になっていました。

これをcrunchedに設定しました。本当はこの規模ならムービーの方が良い気がしますが、自分がテクスチャからムービーにする方法知らないのでこの方法を使います。
ついでに画像サイズがUIに対して大きすぎる節があるので、少し小さくします。

f:id:tsubaki_t1:20160204223819j:plain

f:id:tsubaki_t1:20160204223703j:plain

f:id:tsubaki_t1:20160204223712j:plain

これで大分小さくなりましたが、もう少し小さく出来そうな部分がありそうなので、それを設定していきます。

ちなみにcrunchedを使えるのはPCのみです。モバイルはもっと他のアプローチを考える必要があります。AssetBundleに圧縮してローカルから読むとか。
フルカラー使えるメモリ的な余裕があるならJPEGとかPNGも使えますが

透明を持つスプライトをパックでまとめる

もう一つのアプローチはスプライトの透明な部分を省くアプローチです。座標の調整を簡単にするためにUIに透明を持たせたままにするのは良くやる手法ですが、これを行うと透明な部分が無駄です。

f:id:tsubaki_t1:20160204223951j:plain

なので、透明な部分を切り取りスプライトをパックしてしまいます。
やり方は単純で、スプライトをSpritePackerでパックするだけです。変な事が起こらなければスプライトがパックされて、透明な部分をくり抜いた感じのテクスチャが出来上がります。
このやり方だとパックしたUIの透明が最終的に切り取られてるだけで、UIの座標敵にはパック前の物が使えるので、調整が楽だったりします。

f:id:tsubaki_t1:20160204224059j:plain

例えばノベルゲームのような、キャラクターの表情と体が異なる画像をたくさんもつとテクスチャ容量がマッハ…ですが顔の位置調整が面倒くさい…みたいなケースでは、こんな感じでキャラの顔は統合してしまうと、楽に配置してキャラの顔差し替えも楽で、テクスチャ・メモリ容量・ローディングに優しいといった感じに出来るかなと思います。

WebGL向けに出す

最後の〆で、WebGL向けに出します。何故WebGLかと言えば、ブラウザで遊んでほしかったからです。で、その過程でLZ4圧縮が入ります。これでリソースを更に圧縮出来るので、非常にアプリサイズが小さくなります。

ちなみにPC向けも本当なら空アプリで9MBくらいしかありませんが、リソースに圧縮がかからないので大きくなります。まあ5.3からLZ4が来たので、あまりデメリット無く圧縮出来るようになりましたが。

感想

と、そんな感じで色々やってる内に、なんかアプリが凄く小さくなっていましたとさ。めでたしめでたし。

関連

tsubakit1.hateblo.jp