最終更新:2010 年 1 月(読み終わるまでの時間:10 分)

スマートなゲーム開発のパイプラインを構築する

このページで学ぶ内容:ゲーム開発サイクル全体を見通せるガイドです。Unity フィールドエンジニアの Valentin Simonovによるヒントに従えば、スマートな開発パイプラインを構築できるようになり、最終的には、よりパフォーマンスの高い、優れたコンテンツをリリースすることができるようになります

Unity-コラボレーションのために Unity Teams を設定する

ゲームプロジェクトの計画とリサーチ

これはすべてのソフトウェア開発プロジェクトにおいて最も重要な部分です。このフェーズで下した判断により、開発サイクル全体の道筋が決まります。

機能をターゲットプラットフォームにマッピングする

  • 予定されているすべての機能がすべてのターゲットプラットフォームで動作することを確認する。これは特に、メモリ管理、マルチスレッディング、ネットワーク、プラグインのサポートに関していくつかの制約がある WebGL に関連するものです。

プロジェクトで最低限コンテンツの動作を保証するデバイスを指定する 

  • それらを開発チームと QA チームが利用できるようにする。
  • 現実的なパフォーマンスとフレームの予算を維持できるように、開発の初期段階に全体でテストを実施しておく。

早い段階でフレームとアセットの予算を設定する

以下の予算を定義する。

  • モデル:ターゲットデバイスでレンダリングできる頂点の数はいくつか?
  • アセット:モデルとテクスチャはどの程度細かく厳密にするか?
  • スクリプトとレンダリング:ロジック、レンダリング、エフェクトやその他のサブシステムは
    フレームのうち何パーセントを占めるか?

早い段階でシーンの分割とプレハブの分割を設定する

  • レベルを(加算的にロードされた)シーンに分割する。
  • 別にしたオブジェクトをプレハブへ移動する。Nested Prefabs を使用すれば、シーンをさらに分割してマージの競合を減らすことができます。
  • メインシーンのロッキング機構について合意する。

アセットのパイプラインプロセスを計画する 

インポートプロセスは、アーティストのアセットの仕様に対応している必要があります。 

  • 可能であれば、このプロセスを定義するために最初からテクニカルアーティストに関与してもらう。
  • アセットのフォーマットと仕様に関する明確なガイドラインを定義する。
  • AssetPostprocessor を使用してアセットのインポートを自動化する。

ビルドプロセスと QA プロセスの準備を整える 

  • ビルドマシンをセットアップするか、Unity Teams を有効にしてセットアップする。
  • 以下のプロセスを確立する。
    • リリースビルドとしての機能公開
    • 新しいビルドのテスト
    • テストの自動化
    • 統計情報の記録

アイデアのプロトタイプを作成するが、実際のプロジェクトを一から開始できるよう準備する

プロトタイプを構築して管理部門による承認を受けた後に、一から作成を開始することを強くお勧めします。 

  • プロトタイピングの間に下された意思決定では、通常はスピードが優先される。
  • 多数のハックをゲームのベースにするのは、どのようなプロジェクトにとっても良い開始点とは言えない。

追加のヒント

グラフィックパフォーマンスの最適化

パフォーマンス最適化のためのキャラクターのモデリング

アートアセットベストプラクティスガイド

Unity の新しいアセットインポートパイプライン

Nested Prefabs

Unity Test Framework を使用してコードの品質を保証する

Unity プロファイラー

開発のスピードアップ

以下のベストプラクティスに従って開発をスピードアップし、最終製品の品質を高めましょう。

バージョン管理を正しく手配する 

  • テキストのシリアル化を使用する(デフォルトでは Unity で)。
  • 組み込みの YAML マージツールをセットアップする。SmartMerge の詳細についてはこちらを参照してください。
  • コミットをフックする。詳細についてはこちらを参照してください。

キャッシュサーバーを使用する 

  • プラットフォームを切り替えると、開発速度が低下する。
  • チームにキャッシュサーバーが確実にセットアップされるようにする。

JSON または XML ファイルに静的データを保存しないようにする

  • これによりロードにかかる時間が長くなる。
  • 解析によりごみが生成される。
  • 代わりに、組み込みの静的データを取得するためにカスタムエディターツールで ScriptableObject を使用する。

プロジェクトで未使用のアセット、プラグイン、複製されたライブラリを残さない

プロジェクトで未使用のアセットがゲームに組み込まれたままになることがあります。プロジェクトにごみは残さないようにしましょう。バージョン管理システムを設定すれば、ファイルを手軽に復元できるようになります。

  • アセットストアのアセットからプロジェクトに取り込まれたアセットの依存関係を確認する。たとえば、プロジェクトに 5 つの異なる JSON ライブラリがあるのを発見して驚くことがあります。
  • 初期のプロトタイプに形骸化したアセットやスクリプトがないかどうかをチェックする。
  • 古いアセットを「削除済み」フォルダーに移動しても、リソースとスクリプトは依然としてゲームに組み込まれたままになっている。

反復的なアクションには手動での作業が必要

  • 反復タスクごとにそれを自動化するスクリプトを作成する必要がある。
  • どのシーンからでもゲームやインタラクティブコンテンツを「プレイ」できることを確認する。
  • ビルドプロセスを自動化する Cloud Build などのソリューションを検討する。

エディターだけでなくターゲットデバイスでもプロジェクトのプロファイリングを行う 

  • 必ず、ターゲットデバイス上でコンテンツのプロファイリングを行う。エディターのみでプロファイリングを行ってしまうと、パフォーマンスのボトルネックを見逃してしまう可能性があります。

プロファイリングツールでもデバッグツールでも、ビルトインとプラットフォーム固有の両方のツールを使用する

以下のリソースで、Unity のプロファイリングツールについて学ぶことができます。  

早めの段階でプロファイリングと最適化を行う

  • プロファイリングを待つ時間が長くなればなるほど、パフォーマンスコストが高くなる可能性がある。
  • 早い段階でプロファイリングを始めて、プロジェクトがフレーム、メモリ、ディスクサイズの予算に収まるようにする。
  • 最適化の前にプロファイリングをする。こうすることで、最適化しなければならない実際のボトルネックについてのデータが得られます。 

ターゲットプラットフォームについてできるだけ多くの知識を得る 

  • デスクトップ、モバイル、コンソールと、プラットフォームによりボトルネックはまったく異なる。

追加のヒント

安定して柔軟なビルドパイプラインを構築する方法

インポート設定

正しいアセット設定の選択

アセットはゲームのサイズの大部分を占めます。アセットの設定を慎重に検討することで、最適化にかかる時間を節約しましょう。  

スプライトアトラスを正しく設定する

  • シーン内で一緒に使用されるスプライトにはスプライトアトラスを使用するようにする。これにより、ゲームやインタラクティブコンテンツでのドローコールの回数を減らせます。
  • または、タイルマップの使用を検討する。これにより、2D ゲームのパフォーマンスを改善できます。タイルマップを使用した最適化のヒントについてはこちらを参照してください。 

テクスチャを正しく設定する

  • ターゲットプラットフォームのテクスチャの正しい設定を理解していることを確認する。

    • そのプラットフォームに対応している圧縮形式は何か?
    • テクスチャにミップマップは必要か?
  • 新しいテクスチャ用のこれらの設定を、このプロジェクトで示すように AssetPostprocessor API を使用して適用する自動化された方法をセットアップする。
  • アーティストが間違った設定でテクスチャをコミットするのを防ぐ。

Addressable Asset System を試す 

新しい Addressable Asset System は、アセットのアドレス、ビルド、ロードに関する一般的な問題を解決するためのフレームワークを提供します。コンテンツパックの作成とデプロイを簡略化することにより、アセット管理のオーバーヘッドに対処します。詳細については、以下のリソースを参照してください。

Addressable を使用してコンテンツ管理を簡略化する

Addressable Asset System に関するドキュメント

Addressables for live content management(リアルタイムでのコンテンツ管理のための Addressable)

 

プログラミングの生産性向上

コードアーキテクチャに関するベストプラクティスに従って、生産性を高めましょう。

コードエディターの効率的な使用方法を理解する 

  • コードエディターのすべての機能とショートカットを理解しておく。これにより、日常的なタスクをスピードアップできます。 
  • Visual Studio を使用する場合は、こちらのビデオで Unity プロジェクトの作業時のヒントとコツを確認する。または、こちらのビデオで JetBrains Rider に関するヒントを確認してください。 

抽象化したコードは避ける 

  • 抽象化された大規模なコードは実行速度が遅く、IL2CPP がより多くのコードを生み出す必要があるため、ほとんどの状況で適さない。 

明確なアーキテクチャの規約を作成し、文書化する

  • コードを記述するときは、同じタスクを実行するために異なるメソッドを使用しない。例: 

    • 設定のフォーマット (ファイル、プロパティ、アセット)。
    • イベント(Unity イベント、C# イベント、SendMessage)。
  • どのマネージャーがどのオブジェクトを担当するかを定義する。

Unity フレームループを理解する

  • Awake、OnEnable、Update、その他メソッドが呼び出されたとき。
  • コルーチンが更新されたとき。
  • FixedUpdate が実行された方法。

 

スクリプト初期化のロジックを Unity の実行順に依存させないようにする 

  • ゲーム中に MonoBehaviour がインスタンス化されると、Unity はその Awake メソッドと Start メソッドを呼び出します。ゲームが単純なうちは、最初のシーンがロードされたときに各 MonoBehaviour がインスタンス化される順序は問題にならないかもしれません。ただ、後になって「Project Settings」の「Script Execution Order」リストを使用してこの順序を変更したくなることはあるでしょう。しかし、このリストに含まれるスクリプトが増えると、このリストへの依存が原因で、追跡が困難なバグが発生する可能性があります。その場合は、起動時に他のすべての MonoBehaviour に対する初期化関数を呼び出すスクリプトを作成することをお勧めします。

ロジックやアニメーションのスクリプトを作成する際にフレームレートを把握しておく

  • FPS に依存しないスクリプトには Time.deltaTime を使用する。

追加のヒント:

ScriptableObject を使って構築するための 3 つの方法

より優れたスクリプティング体験を

 

Unity-CPU プロファイラー

CPU パフォーマンスの最適化

CPU 使用率を最適化して、スムーズなパフォーマンスを実現し、バッテリ寿命を延ばしましょう。  

Update() メソッドの使用を控える

  • ネイティブ -> マネージドコールには、ある程度のオーバーヘッドがある。代わりにカスタムマネージャーを使用してください
  • カスタム挙動を Update/Awake/Start メソッドが定義された抽象クラスから継承しないようにする。

ゲーム内のさまざまなシステムの更新頻度を定義する

すべてのシステムをフレームごとに更新する必要があるわけではありません。以下の領域を確認します。

  • 移動するオブジェクト
  • AI と経路検索
  • ゲームの状態のロギングと保存
  • その他、「重くなる」システム

以下のような、頻繁に必要になるデータをキャッシュする

  • リフレクション
  • Find()
  • Camera.main
  • GetComponent()

頻繁にインスタンス化されるオブジェクトをプールする

  • オブジェクトのインスタンス化には時間がかかる。
  • ゲーム/コンテンツの起動時にオブジェクトのプールを作成する。
  • 新しく作成する代わりにオブジェクトを再利用する。

フレームごとにメモリを割り当てない

  • フレームごとに小さい割り当てを行うと GC スパイクの原因になる。
  • すべての割り当ての排除を試行する。

次のようなメモリ割り当て API の代替手段を試す。 

  • LINQ。
  • 文字列の連結。
  • 次の配列を返す Unity API: 
    • Physics.RaycastAll、Mesh.vertices、GetComponents など。

追加のヒント:

1K 更新呼び出し

Unity の進化したベストプラクティス

 

Unity の GPU プロファイラー

GPU パフォーマンスの最適化

ここで紹介するヒントに従って、グラフィックパフォーマンスのスパイクを回避しましょう。

モバイルゲーム内のオーバードローはパフォーマンスのボトルネックの原因となるので避ける

  • モバイル GPU は、毎秒限られた数のピクセルのみ描画できる。
  • 必要ない透明な画像を描画しない。
  • より複雑なメッシュを使用して完全に透明な領域を切り抜く。

モバイルプロジェクト内のシェーダーにはユニバーサルレンダーパイプラインを使用する

ダイナミックバッチングを中断する可能性があるような設定ミスに注意する

  • オブジェクトが動的にバッチ処理されるには「類似」している必要がある。
  • フレームデバッガーに、特定のオブジェクトがバッチ処理されなかった理由が表示される。
  • ユニバーサルレンダーパイプラインで SRP Batcher を使用すると、バッチ処理されるオブジェクトの数を増やすことができる。 

LOD を正しく設定する

  • LOD により、カメラから遠いオブジェクトのレンダリングを効率化できる。 

追加のヒント

ドローコールがバッチ処理されない理由

モバイル最適化に関するベストプラクティス

Unity-Unity UI

UI のパフォーマンスを最適化する

Unity UI はアーティストにとって使いやすいツールです。ここで紹介するヒントに従って、UI のパフォーマンスを維持しましょう。

さまざまな解像度とアスペクト比を考慮する

  • デバイスでさまざまな解像度とアスペクト比で UI をテストする
  • デバイスによって異なる UI 画面を作成する方がよい場合がある

アニメーション化された要素を別のキャンバスに移動する 

  • 要素が変更されるとキャンバスは新しく結合されたメッシュを作成するため、複雑なキャンバスではコストがかかる可能性がある。 

新しい UI ウィンドウが開くときにラグが発生しないようにする

  • 新しいウィンドウや UI の大きなチャンクが作成されると、ゲームにラグが発生する。以下を行うことにより、この影響を最小化します。 
  • UI ウィンドウをより単純にする。
  • UI を複数のパーツに分割する。
  • ウィンドウをキャッシュする。

リストに大量のアイテムが含まれないようにする

  • 一度にすべてを作成する代わりに、リスト項目を動的に再利用する。
  • リスト内にネストされたキャンバスを作成する。

こちらのようなオープンソースの実装を使用してください。

追加のヒント

Unity で目を引くような UI をデザインする

弊社のウェブサイトは最善のユーザー体験をお届けするためにクッキーを使用しています。詳細については、クッキーポリシーのページをご覧ください。

OK