
Unityプロジェクトをより強力なパフォーマンスのために設定する
このウェブページは、お客様の便宜のために機械翻訳されたものです。翻訳されたコンテンツの正確性や信頼性は保証いたしかねます。翻訳されたコンテンツの正確性について疑問をお持ちの場合は、ウェブページの公式な英語版をご覧ください。
これは、Unityプロジェクトの最適化のヒントを解説する一連の記事の最初のものです。より少ないリソースで高いフレームレートで実行するためのガイドとして使用してください。これらのベストプラクティスを試したら、シリーズの他のページもぜひご覧ください:
Unity 6の開発者とアーティストのための最新の最適化ガイドをご覧ください:
より強力なパフォーマンスのためにプロジェクトを設定する
最適化されたアセットパイプラインは、ロード時間を短縮し、メモリ使用量を減らし、ランタイムパフォーマンスを向上させることができます。経験豊富なテクニカルアーティストと協力することで、チームはアセットフォーマット、仕様、およびインポート設定を定義し、効率的でスムーズなワークフローを確保できます。
デフォルト設定のみに依存しないでください。プラットフォーム固有のオーバーライドタブを利用して、テクスチャ、メッシュジオメトリ、オーディオファイルなどのアセットを最適化します。不正確な設定は、ビルドサイズの増加、ビルド時間の延長、メモリ使用量の悪化を引き起こす可能性があります。
特定のプロジェクトニーズに合わせたベースライン設定を確立するために、プリセットの使用を検討してください。この積極的なアプローチは、アセットが最初から最適化されることを確保し、すべてのプラットフォームでのパフォーマンス向上と一貫した体験をもたらします。
さらなるガイダンスについては、アートアセットのベストプラクティスを参照するか、Unity Learnのモバイルアプリケーション向けの3Dアート最適化コースを探索してください。これらのリソースは、Unityのウェブビルド、モバイル、XRアプリケーションのアセット最適化に関する情報に基づいた意思決定を行うのに役立つ貴重な洞察を提供します。

UNITYで2Dスプライトをパッキングする際の3種類のアトラス
不要なプレイヤーまたは品質設定を無効にする
プレイヤー設定で、サポートされていないプラットフォームのために自動グラフィックスAPIを無効にして、過剰なシェーダーバリアントの生成を防ぎます。古いCPUをサポートしていない場合は、ターゲットアーキテクチャを無効にします。
品質設定で不要な品質レベルを無効にします。
グラフィックスAPIについて詳しく学びます。

品質設定で不要な品質レベルを無効にします。
IL2CPPに切り替える
スクリプトバックエンドをMonoからIL2CPP(中間言語からC++)に切り替えることで、全体的により良いランタイムパフォーマンスを提供できます。ただし、ビルド時間が増加する可能性もあります。一部の開発者は、より迅速な反復のためにローカルでMonoを使用し、ビルドマシンやリリース候補のためにIL2CPPに切り替えることを好みます。ビルド時間を短縮する方法については、IL2CPPビルド時間の最適化ドキュメントを参照してください。
注:このオプションを使用すると、Unityはターゲットプラットフォーム用のネイティブバイナリファイル(.exe、.apk、.xap)を作成する前に、スクリプトとアセンブリからILコードをC++に変換します。
IL2CPP内部の紹介を参照するか、コンパイラオプションマニュアルページを参照して、さまざまなコンパイラオプションがランタイムパフォーマンスにどのように影響するかを学びます。
適切なフレームレートを選択する
モバイルプロジェクトは、フレームレートとバッテリー寿命、サーマルスロットリングのバランスを取る必要があります。60 fpsでデバイスの限界を押し上げるのではなく、妥協として30 fpsで実行することを検討してください。Unityはモバイル用にデフォルトで30 fpsを設定しています。
XRプラットフォームをターゲットにする場合、フレームレートの考慮はさらに重要です。72 fps、90 fps、または120 fpsのフレームレートが必要なことが多く、没入感を維持し、動きの病気を防ぐために必要です。これらの高いフレームレートは、VR環境での快適さにとって重要なスムーズで応答性の高い体験を確保するのに役立ちます。ただし、これらは特にスタンドアロンのVRヘッドセットにおいて、電力消費と熱管理に関して独自の課題を伴います。
適切なフレームレートを選択することは、モバイルデバイス、スタンドアロンのVRヘッドセット、またはARデバイスなど、ターゲットプラットフォームの特定の要求と制約を理解することに関するものです。適切なフレームレートを慎重に選択することで、さまざまなプラットフォームでパフォーマンスとユーザー体験の両方を最適化できます。
Application.targetFrameRateを使用して、ランタイム中にフレームレートを動的に調整することもできます。例えば、遅いまたは比較的静的なシーンでは30 fpsを下回ることができ、ゲームプレイにはより高いfps設定を予約します。
詳細については、ドキュメントをご覧ください。
加速度センサーの頻度を減らすか無効にする
Unityは、モバイルの加速度センサーを1秒間に数回プールします。アプリケーションで使用していない場合はこれを無効にするか、全体的なパフォーマンスを向上させるためにその頻度を減らしてください。
加速度センサーについて詳しく学びましょう。

モバイルゲームで加速度センサーを使用していない場合は、加速度センサーの頻度を無効にしてください。
大きな階層を避ける
階層を分割してください。GameObjectが階層にネストされる必要がない場合は、親子関係を簡素化してください。
小さな階層は、シーン内のTransformを更新するためにマルチスレッド処理の恩恵を受けます。複雑な階層は、不要なTransform計算とガベージコレクションのコストを引き起こします。
Transformに関するヒントについては、階層の最適化とこのUniteトークを参照してください。
テクスチャを圧縮する
上記の2つの例は、同じモデルとテクスチャを使用しています。左側の設定は、右側の設定の約26倍のメモリを消費し、視覚的品質の改善はほとんどありません。
モバイル、XR、ウェブ用に適応型スケーラブルテクスチャ圧縮(ATSC)を使用してください。開発中のゲームの大多数は、ATSC圧縮をサポートする最小仕様のデバイスをターゲットにする傾向があります。
唯一の例外は:
- A7デバイスまたはそれ以下をターゲットにしたiOSゲーム(例:iPhone 5、5Sなど) – PVRTCを使用
- 2016年以前のデバイスをターゲットにしたAndroidゲーム – ETC2(エリクソンテクスチャ圧縮)を使用
PVRTCやETCのような圧縮形式が十分に高品質でない場合、またはASTCがターゲットプラットフォームで完全にサポートされていない場合は、32ビットテクスチャの代わりに16ビットテクスチャを使用してみてください。
プラットフォーム別の推奨テクスチャ圧縮形式に関する詳細はマニュアルを参照してください。

非圧縮テクスチャは圧縮テクスチャよりも多くのメモリを必要とします。
テクスチャインポート設定を活用する
テクスチャは過剰なリソースを使用する可能性があるため、インポート設定を最適化することが重要です。一般的に、次のガイドラインに従うようにしてください:
- 最大サイズを下げる:視覚的に許容できる結果を得るために、最小限の設定を使用してください。これは非破壊的で、テクスチャメモリを迅速に削減できます。
- 2の累乗を使用する(POT):Unityはテクスチャ圧縮フォーマットのためにPOTテクスチャの寸法を必要とします。
- Read/Write Enabledオプションをオフにする:有効にすると、このオプションはCPUとGPUのアドレス可能メモリの両方にコピーを作成し、テクスチャのメモリフットプリントを倍増させます。ほとんどの場合、これを無効にし、ランタイムで上書きする必要があるテクスチャを生成する場合のみ有効にしてください。このオプションは、Texture2D.Applyを介して強制することもでき、makeNoLongerReadableをTrueに設定して渡します。
- 不要なミップマップを無効にする:ミップマップは、画面上で一貫したサイズを維持するテクスチャには必要ありません。例えば、2DスプライトやUIグラフィックスなどです。ただし、カメラからの距離が変わる3Dモデルにはミップマップを有効にしておいてください。
テクスチャインポート設定について詳しく学んでください。
テクスチャをアトラス化する
アトラス化は、いくつかの小さなテクスチャを1つの大きなテクスチャにまとめるプロセスです。テクスチャアトラスはメモリ使用量を削減し、描画呼び出しを減らすため、GPUの負担を軽減します。
- 2Dプロジェクトの場合:個々のスプライトやテクスチャをレンダリングするのではなく、スプライトアトラス(アセット > 作成 > 2D > スプライトアトラス)を使用してください。
- 3Dプロジェクトのために:お好みのデジタルコンテンツ制作(DCC)パッケージを使用できます。MA_TextureAtlasserやTexturePackerなどのサードパーティツールを使用して、テクスチャアトラスを作成することもできます。
高解像度のマップを必要としない3Dジオメトリのために、テクスチャを組み合わせてUVを再マッピングします。ビジュアルエディタにより、テクスチャアトラスやスプライトシートのサイズと位置を設定し、優先順位を付けることができます。
テクスチャパッカーは、個々のマップを1つの大きなテクスチャに統合します。Unityは、パックされたテクスチャにアクセスするために、単一のドローコールを発行し、パフォーマンスのオーバーヘッドを小さくします。
スプライトアトラスについてはこちらをお読みください。

ドローコールの数を減らすためにテクスチャアトラスを使用します。
ポリゴンのカウントを確認してください
高解像度のモデルは、より多くのメモリを使用し、GPUの処理時間が長くなる可能性があります。背景ジオメトリは50万ポリゴンを必要としますか?お好みのDCCパッケージでモデルを削減することを検討してください。カメラの視点から見えないポリゴンを削除し、高密度メッシュの代わりにテクスチャと法線マップを使用して細部を表現します。

モデルを最適化するために見えない面を削除します。
メッシュのインポート設定を管理する
テクスチャと同様に、メッシュもかなりのメモリを消費する可能性があるため、最適なインポート設定を選択してください。以下の方法でメッシュのメモリフットプリントを削減します:
- メッシュを圧縮する:攻撃的な圧縮はディスクスペースを削減できます(ただし、ランタイム時のメモリには影響しません)。メッシュの量子化は不正確さを引き起こす可能性があるため、モデルに適した圧縮レベルを試してみてください。
- 読み書きの無効化:このオプションを有効にすると、メモリ内にメッシュの複製が作成され、システムメモリに1つのコピー、GPUメモリに別のコピーが保持されます。ほとんどの場合、これを無効にするべきです(Unity 2019.2以前では、このオプションはデフォルトでチェックされています)。
- リグとブレンドシェイプを無効化:メッシュがスケルトンやブレンドシェイプアニメーションを必要としない場合は、可能な限りこれらのオプションを無効にしてください。
法線と接線を無効化:メッシュマテリアルが法線や接線を必要としないと確信している場合は、追加の節約のためにこれらのオプションのチェックを外してください。

メッシュのインポート設定を確認してください
さらに多くのメッシュ最適化を確認する
追加のメッシュ最適化オプションは、プレイヤー設定で利用可能です:
- 頂点圧縮は、各チャンネルの頂点圧縮を設定します。例えば、位置とライトマップUVを除くすべてに圧縮を有効にできます。これにより、メッシュからのランタイムメモリ使用量を削減できます。
- 注:各メッシュのインポート設定のメッシュ圧縮設定は、頂点圧縮設定を上書きします。その場合、メッシュのランタイムコピーは非圧縮され、より多くのメモリを使用する可能性があります。
- メッシュデータの最適化は、適用されたマテリアルによって必要とされないメッシュのデータ(接線、法線、色、UVなど)を削除します。
アセットを監査する
監査プロセスを自動化することで、アセット設定を誤って変更するのを避けることができます。アセットポストプロセッサは、インポート設定を標準化したり、既存のアセットを分析したりするのに役立ちます。アセットをインポートする際にスクリプトを実行でき、基本的にモデル、テクスチャ、オーディオなどをインポートする前後に設定をカスタマイズするよう促します。
非同期テクスチャバッファを調整する
UnityはテクスチャをGPUにプッシュするためにリングバッファを使用します。この非同期テクスチャバッファは、QualitySettings.asyncUploadBufferSizeを介して手動で調整できます。
アップロードレートが遅すぎるか、メインスレッドが複数のテクスチャを同時に読み込んでいる間に停止した場合は、これらのテクスチャバッファを調整してください。通常、シーンで読み込む必要のある最大テクスチャのサイズ(MB単位)に値を設定できます。
デフォルト値を変更すると、高いメモリ圧力が生じる可能性があることに注意してください。また、Unityが割り当てた後にリングバッファメモリをシステムに戻すことはできません。GPUメモリがオーバーロードすると、GPUは最も最近の使用されていないテクスチャをアンロードし、次回カメラのフラスタムに入るときにCPUに再アップロードを強制します。
テクスチャバッファのすべてのメモリ制限については、メモリ管理チュートリアルを参照し、読み込みパフォーマンスの最適化を参照して、読み込み時間を改善する方法を確認してください。
ミップマップとテクスチャをストリームする
Mip Map Streamingシステムは、どのMip Mapレベルをメモリに読み込むかを制御します。Unityの品質設定(編集 > プロジェクト設定 > 品質)に移動して、テクスチャストリーミングオプションをチェックすることで有効にできます。テクスチャインポート設定の上級者向けでストリーミングMipマップを有効にできます。
このシステムは、現在のカメラ位置をレンダリングするために必要なMipマップのみを読み込むため、テクスチャに必要なメモリの総量を削減します。そうでなければ、Unityはデフォルトで全てのテクスチャを読み込みます。
テクスチャストリーミングは、潜在的に大きなGPUメモリを節約するために、少量のCPUリソースを取引します。また、ユーザー定義のメモリバジェット内に収まるように自動的にMipマップレベルを減少させます。
さらなる制御のためにMip Map Streaming APIを使用できます。

テクスチャストリーミング設定
アドレスアブルを使用する
アドレス可能アセットシステムは、コンテンツを管理するための簡素化された方法を提供します。この統一システムは、アセットバンドルを「アドレス」またはエイリアスで、ローカルパスまたはリモートコンテンツ配信ネットワーク(CDN)から非同期に読み込みます。
非コードアセット(モデル、テクスチャ、Prefab、オーディオ、さらには全シーン)をAssetBundleに分割すると、ダウンロード可能なコンテンツ(DLC)として分離できます。
次に、Addressablesを使用して、モバイルアプリケーションの初期ビルドを小さく作成します。Cloud Content Deliveryを使用すると、プレイヤーがゲームを進めるにつれてゲームコンテンツをホストおよび配信できます。
Addressable Asset Systemがプロジェクトでどのように機能するかの簡単な概要については、Unity LearnのチュートリアルGet started with Addressablesを参照してください。
アセット管理の手間を省く方法を確認するには、こちらをクリックしてください。

ADDRESSABLE ASSET SYSTEMを使用して「ADDRESS」でアセットをロード
Unity 6のためのさらなるヒント
Unityベストプラクティスハブから、上級Unity開発者やクリエイター向けのベストプラクティスやヒントを見つけてください。業界の専門家やUnityのエンジニア、テクニカルアーティストが作成した30以上のガイドから選択し、Unityのツールセットやシステムを使って効率的に開発する手助けをします。
