アセットバンドル FAQ
ソーシャル API

ファイルサイズの削減

ビルドされたアプリのファイルサイズを最小限にすることは、特にモバイルや容量制限のあるアプリストアなどで重要です。サイズを小さくするためにまずは、最も負担を与えているアセットを特定することであり、これらのアセットは最適化の候補として最も有力です。この情報はビルド直後エディターログから見つけることができます (コンソールウィンドウの右上の小さいパネルメニューから Open Editor Log を選択してください)。

ビルド直後のエディターログ
ビルド直後のエディターログ

タイプによってアセット項目ごとに分類されたログが提供され、サイズに貢献するための個々のアセットの全リストを表示します。一般的にスクリプト、レベルやシェーダーはしばしば無視できますが、テクスチャ・音楽・ビデオ等が、最もストレージを占有します。File Headers について少し触れておくと項目としてはアセットではありません。ヘッダーは、実際は特別なデータで“生”アセットファイルを保存するための参照と設定です。ヘッダーは、通常アセットのサイズにほとんど違いを与えませんが、Resources フォルダー内に多数の大規模アセットがある場合は、値が大きくなる可能性があります。

ログは自身のアセット内で削除・最適化したいときに役立ちますが、利用する前によく考える必要があります。

  • Unity は、アセットを独自の内部フォーマットに変換してインポートするため、元となるアセットの種類はさほど関係ありません。例えば、プロジェクトでマルチレイヤーの Photoshop のテクスチャを持っている場合、ビルドされる前に平坦化され、圧縮されます。PNG ファイルのテクスチャをエクスポートしても、ビルドサイズに違いはないので開発時に最も便利なフォーマットにするべきです。

  • Unity は、ビルド中に使用していないアセットを省くので、プロジェクトからアセットを手動で削除する必要はありません。 ですが削除されないアセットがあり、スクリプト(一般的にかなりちいさな)と Resources フォルダー内のアセットです(スクリプトから利用する Resources フォルダーは、Unity 側でどれが必要かどうか判断することができないからです)。これを踏まえて、Resources フォルダー内のアセットは本当に必要とするものだけを含めているか確認する必要があります。アセットを動的に読み込むのに、Resources フォルダーではなく アセットバンドル へと置き換えることも可能です。これにより、ビルド後のアプリサイズを削減することができます。

ビルドサイズを削減するための提案

テクスチャ

多くの場合、テクスチャはビルドサイズのうち、ほぼ大部分を消費します。まず最初に、圧縮テクスチャ形式 (DXT( Desktop platforms ) または PVRTC) を使用できるかどうかを確認してください。

圧縮形式を使用してもサイズが減らない場合は、テクスチャの大きさを減らしてみてください。ここでのポイントは、実際のソースの内容を編集する必要がないということです。プロジェクトビューでテクスチャを選択し、インポート設定で Max Size を設定します。シーンビュー で見た目が悪くなり始めるまで、テクスチャを使用するオブジェクトを拡大し、Max Size を調整するのはよい考えです。

Max Texture Size を変更しても、テクスチャには影響せず、ゲーム内の解像度のみに影響します
Max Texture Size を変更しても、テクスチャには影響せず、ゲーム内の解像度のみに影響します

次の表は、画像フォーマットがピクセルあたりのバイト数でどのくらいのストレージを消費するかを示しています。

Compression メモリの消費 (bytes/pixel)
Standalone & WebGL
RGB Crunched DXT1 variable
RGBA Crunched DXT5 variable
RGB Compressed DXT1 0.5 bpp
RGBA Compressed DXT5 1 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
iOS
RGB Compressed PVRTC 2 bits 0.25 bpp (バイト/ピクセル)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
Android
RGB Compressed DXT1 0.5 bpp (バイト/ピクセル)
RGBA Compressed DXT5 1 bpp
RGB Compressed ETC1 0.5 bpp
RGB Compressed PVRTC 2 bits 0.25 bpp (バイト/ピクセル)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

テクスチャの合計サイズの求め方は: 幅 _ 高さ _ bpp。ミニマップがある場合は 3 倍以上にします。

デフォルトでは、Unity はインポート時にすべてのテクスチャを圧縮します。ワークフローをより高速にするため、Preferences でこれをオフにできます。ゲーム作成とき圧縮されていないすべてのテクスチャが圧縮されます。

メッシュおよびアニメーション

ゲームファイルでの使用スペースを減らすよう、メッシュ およびインポートされたアニメーションクリップを圧縮できます。メッシュインポート設定で圧縮をオンにできます。

メッシュとアニメーションの圧縮は、少ないスペースしか取りませんが圧縮は不精密なデータになることに注意してください。あなたのモデルで許容できる圧縮レベルを試してみてください。

メッシュ圧縮は小さいデータファイルしか生成せず、ランタイムで使用するメモリは少なくなることに注意してください。アニメーション Keyframe reduction は、小さいデータファイルしか生成せず、ランタイムで使用するメモリは少なくなり、一般に、常にキーフレーム削減を使用します。

DLL

デフォルトでは、Unity はビルドされたプレイヤーでのみ次の DLL を含みます。

  • mscorlib.dll
  • Boo.Lang.dll
  • UnityScript.Lang.dll
  • UnityEngine.dll

プレイヤーをビルドするとき、System.dllSystem.Xml.dll との依存関係を避ける必要があります。Unity では、デフォルトでビルドされるプレイヤーにこれらの DLL が含まれませんが、DLL 内のクラスを使用する場合、後で含まれることになります。この DLL はプレイヤーのストレージを 1 MB 程度圧迫します。ゲームで XML を解析する必要がある場合は、代替手段として Mono.Xml.zip のようなライブラリを使用してください。Stack<> や System.dll にある多くの Generic コンテナは mscorlib に含まれています。よって可能であれば System.dll の使用は避けるべきです。

見てわかるとおり、プレイヤーをビルドするとき System.Xml.dll と System.dll が含まれている
見てわかるとおり、プレイヤーをビルドするとき System.Xml.dll と System.dll が含まれている

モバイル用 .NET Library のサイズ削減

Unity は一部のモバイルデバイス向け.NET API の互換性レベルとして、2 つをサポートしています(NET 2.0 と Net 2.0 Subset )。プレイヤー設定 でビルドで最適なレベルを選択することができます。

.NET 2.0 API プロファイルは、フルの .NET 2.0 API に近いものです。ほとんどのライブラリルーチンは完全に実装されています。したがって、このオプションは既存の .NET コードと最高の互換性を提供しています。しかし、多くのゲームではフルライブラリを必要とすることはありません。さらに、不必要なコードは貴重なメモリ領域を食いつぶしてしまいます。

メモリの無駄を避けるため、Unity は .NET 2.0 Subset API プロファイルもサポートしています。これは Mono の “monotouch” プロファイルに近いもので “monotouch” の制約がすべて Unity の .NET 2.0 サブセットに適用されます。“monotouch” プロファイルの制約に関する詳細は こちら) を参照してください。一般的に必要とされない多くのライブラリルーチンはメモリを節約するために、このプロファイルから外されます。しかしながら、それらのルーチンに関して、依存関係周りでコードが正しく動作しない可能性もあります。このオプションは最適化するために役に立ちますが、適用した後で既存のコードが正しく動作するか確認する必要があります。

アセットバンドル FAQ
ソーシャル API