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

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

スクリプトバックエンドを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圧縮をサポートする最小仕様のデバイスをターゲットにする傾向があります。
唯一の例外は:
PVRTCやETCのような圧縮形式が十分に高品質でない場合、またはASTCがターゲットプラットフォームで完全にサポートされていない場合は、32ビットテクスチャの代わりに16ビットテクスチャを使用してみてください。
プラットフォーム別の推奨テクスチャ圧縮形式に関する詳細はマニュアルを参照してください。

テクスチャは過剰なリソースを使用する可能性があるため、インポート設定を最適化することが重要です。一般的に、次のガイドラインに従うようにしてください:
テクスチャインポート設定について詳しく学んでください。
アトラス化は、いくつかの小さなテクスチャを1つの大きなテクスチャにまとめるプロセスです。テクスチャアトラスはメモリ使用量を削減し、描画呼び出しを減らすため、GPUの負担を軽減します。
高解像度のマップを必要としない3Dジオメトリのために、テクスチャを組み合わせてUVを再マッピングします。ビジュアルエディタにより、テクスチャアトラスやスプライトシートのサイズと位置を設定し、優先順位を付けることができます。
テクスチャパッカーは、個々のマップを1つの大きなテクスチャに統合します。Unityは、パックされたテクスチャにアクセスするために、単一のドローコールを発行し、パフォーマンスのオーバーヘッドを小さくします。
スプライトアトラスについてはこちらをお読みください。

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

テクスチャと同様に、メッシュもかなりのメモリを消費する可能性があるため、最適なインポート設定を選択してください。以下の方法でメッシュのメモリフットプリントを削減します:
法線と接線を無効化:メッシュマテリアルが法線や接線を必要としないと確信している場合は、追加の節約のためにこれらのオプションのチェックを外してください。

追加のメッシュ最適化オプションは、プレイヤー設定で利用可能です:
監査プロセスを自動化することで、アセット設定を誤って変更するのを避けることができます。アセットポストプロセッサは、インポート設定を標準化したり、既存のアセットを分析したりするのに役立ちます。アセットをインポートする際にスクリプトを実行でき、基本的にモデル、テクスチャ、オーディオなどをインポートする前後に設定をカスタマイズするよう促します。
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を参照してください。
アセット管理の手間を省く方法を確認するには、こちらをクリックしてください。


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