
Unityプロジェクトのためのテストと品質保証のヒント
この記事では、Unityでより安定したプロジェクトを出荷するのに役立つさまざまなテストプラクティスの紹介を提供します。
テスト、または品質保証(QA)は、ゲーム開発サイクル全体で実行されるべき重要なプロセスです。経験豊富な開発者が知っているように、あなたが書くコードはすべてテストする必要があります。
独立した開発者であろうと大規模なチームの一員であろうと、使用できるさまざまなテストおよびQA手法があります(確立されたスタジオには専任のQAエンジニアがいることがよくあります)。
スポーツをプレイしたり観戦したりするのが好きな場合、多くの試合では防御がチャンピオンシップを勝ち取ることを知っています。QAプロセスを、最高のパフォーマンスと安定性を持つゲームをリリースする際に何も偶然に任せない防御戦略と考えてください。
なぜテストと品質保証が重要なのですか?
テストは、コードのバグ、アートワークの視覚的アーティファクト、ゲームデザインやゲームプレイのユーザーエクスペリエンスの問題などの問題を発見するために重要です。最も技術的に印象的なゲームを開発することができますが、10回中9回クラッシュするなら、ユーザーはすぐにあきらめてしまうでしょう。
ゲーム開発サイクルのいつテストを実施すべきですか?
ゲーム開発プロセスの最後にテストを残すことは避けてください。テストを一連の段階の1つとして考えるのではなく、ゲーム開発の他の段階を支える継続的なプロセスとして見ると役立ちます。生産中および出荷前にアイデアやプロトタイプをテストしてください。ゲームの更新ごとにこのプロセスを繰り返してください。
プロジェクトの異なる段階により適したさまざまなテスト技術があります。
テストとQAの責任は誰にありますか?
専任のQAチームがいない小さなスタジオのメンバーですか?友人の作業グループを集めてテストを手伝ってもらうか、サードパーティのQAプロバイダーを選んで手伝ってもらいましょう。社内QAチームを持つスタジオでも、ローカリゼーションテスト(LQA)などの追加テストサービスのために外部企業を利用することがよくあります。
プレイヤーテストはQAのサブセットと見なされ、ゲームがターゲットオーディエンスや市場に響くことを確保するのに役立ちます。これは、開発段階でゲームを改善するためにプレイヤーから貴重なフィードバックを提供するプロセスです。
プレイヤーテストに参加すべき人々は、テストの具体的な目標によって異なります。ただし、一般的には、ゲームのターゲットオーディエンスを代表する多様なプレイヤーグループを関与させることが重要です。さまざまな種類のプレイヤーをプレイヤーテストに関与させることで、ゲーム開発者はさまざまな視点からフィードバックを収集し、ゲームが幅広いオーディエンスにアピールすることを確保できます。
ゲームをQAしテストする方法は?
次のセクションでは、一般的なテスト技術について読むことができます。これらの方法を組み合わせて、コードベースができるだけスムーズに動作することを確保できます。
ターゲットプラットフォーム内のさまざまなデバイスでゲームをテストすることも重要です。これは特にモバイルゲームに当てはまります。異なるオペレーティングシステム、画面サイズ、最低仕様のモバイルデバイスでテストする必要があります。そうすることで、最小デバイス要件のベンチマークを助け、アプリケーションに新しい機能を追加する際には各カテゴリを常に再検討する必要があります。
さまざまなプラットフォームでのテストは、潜在的なゲームを壊す問題を特定するだけでなく、モバイルゲームのバッテリー消耗や熱過熱などの長期的または間接的な影響を理解することも重要です。

単体テスト
ユニットテストは、ゲームの個々のユニットやコンポーネントを孤立してテストする技術であり、開発プロセスの初期にバグを捕捉し、コードの変更が既存の機能を壊さないことを保証するのに役立ちます。
ユニットテストは、コードの特定の動作を試す小さなテストケースを書くことによって行われます。テストは、個々のスクリプト、GameObject、またはゲームの特定の機能で実行できます。
ゲーム開発では、手動および自動のユニットテストの両方の方法を使用する必要があります。
手動ユニットテスト
手動テストは、ゲームの機能や機能性をテストするために人々がゲームをプレイすることを含みます。手動テストを実行することは重要です。なぜなら、自動テストでは検出できない問題、例えばUIバグや不均衡または不十分に実行されたゲームプレイやデザインがあるからです。
Unityでの手動ユニットテストの例は、関数のテスト条件を追加し、Debug.Logを使用して合格または不合格の基準(テストシナリオの出力)を出力することです。これはUnityの再生モードを使用します。
自動ユニットテスト
自動ユニットテストは、個々のユニットやコードの部分を孤立して自動的にテストするためのコードを書くことを必要とします。Unityでは、スクリプト、コンポーネント、およびテストスイートの一部として実行できるゲームコードの他のユニットのテストを書くことができます。
Unity Test Framework(UTF)パッケージは、開発者がUnityエディターの編集モードと再生モードの両方で自分の自動テストを書くためのフレームワークを提供します。UTFは、NUnitを参照する任意のアセンブリ内のテストを探します。そのようなアセンブリはテストアセンブリと呼ばれます。再生モードと編集モードのテストは、別々のアセンブリにする必要があります。
UTFは、エディター内でテストケースを実行および管理するのを助けるテストランナーウィンドウを提供します。
UTFはテストアセンブリ定義を使用するため、プロジェクトをランタイムアセンブリ定義に分解する必要があります。これは、開発プロセスの初期に計画することで簡単に行えます。また、よりモジュール化されたコードを書くことを促進します。
Unityのパッケージ、パフォーマンステスト拡張は、UTFと一緒に使用できる拡張機能です。テストケースから測定を行い、カスタムメトリクスを提供するための追加APIを提供します。
ゲーム開発のためのUnityテストフレームワークチュートリアルを読んで、Unityテストフレームワークの使い方を学びましょう。

テスト駆動開発
テスト駆動開発(TDD)は、機能を実装するための実際のコードを書く前に、その機能のテストを書く技術です。このプロセスは通常、失敗するテストを書くこと、テストを通過させるために必要な最小限のコードを書くこと、そして次のテストケースを設計する前にコードをより保守可能にするためにリファクタリングすることを含みます。
TDDはゲーム開発では非常に稀です(主流のソフトウェア開発ではより一般的です)。これは、プロトタイピングや楽しく魅力的なゲームプレイを作成するための直感に反するプロセスであるためだと思われます。
しかし、ゲームの壊れた部分を特定するプロセスを加速することができるため、ゲームを壊す変更はすぐに失敗したテストケースを作成します。
UnityにおけるTDDの詳細については、ブログ記事「Unityテストランナーを使用したテスト駆動開発のテスト」を参照してください。
コードカバレッジ
TDDまたは単体テストを実装したい場合は、Unityのコードカバレッジパッケージの使用を検討してください。UTFと一緒に使用すると、コードカバレッジパッケージは、プロジェクト内のどのコード行がテストされているかを示し、脆弱または未テストの部分を特定するのに役立ちます。
コードカバレッジは、ゲームを再生モードでテストしている間にレポートを生成することもできます。これにより、単体テストでカバーされていなくても、定期的にテストを実行するコードの部分が表示されます。ただし、コードカバレッジレポートは、テストでカバーされたコード行を示しますが、コード内でロジックが流れた異なる経路を示すことはありません。
ブログ記事「コードカバレッジ:テストのギャップを見つける」の詳細については、こちらをご覧ください。
統合テスト
統合テストは、システムの異なるコンポーネントを一緒にテストして、正しく機能することを確認する技術です。これには、ゲーム内で異なるGameObject、スクリプト、またはシステムがどのように相互作用するかをテストすることが含まれます。その広範な範囲のため、統合テストは、単体テストでは表示されない可能性のあるバグをキャッチするのに役立ちます。例えば、データフローやコンポーネント間の通信の問題などです。
例えば、個別の単位テストを使用する代わりに、この全体のシーケンスのためにインテグレーションテストを書くことができます:プレイヤーが武器を発射し、弾丸を生成し、弾丸が敵に当たり、敵を倒し、プレイヤーが敵を倒したことでポイントを獲得し、プレイヤーが特定のスコアに達したときに実績が解除される。
UnityでインテグレーションテストをビルドするためにUTFを使用できます。SetUpとTearDownメソッドを使用することで、複数のシステムを同時にテストするための環境を作成できます。プレイヤーロジックと入力はシミュレートできます。特にコマンドパターンを使用して実装している場合(新しいInput Systemを使用している場合はおそらくそうです)、プレイヤー入力からゲームロジックへのフルフローをテストするために。
回帰テスト
回帰テストは、ソフトウェアや機能が修正または更新された後に正しく動作することを確認するための方法です。回帰テストの目的は、コードベースへの変更がソフトウェアに新しいバグや回帰を引き起こさないことを確認することです。この技術は、ライブゲームのように頻繁に更新される大規模で複雑なアプリケーションに最適です。予期しない方法で相互作用する可能性のある多くの異なるコンポーネントがある場合があります。
ゲームの世界とメカニクスが拡大するにつれて、回帰テストの必要性も高まり、コストがかかる可能性があります。したがって、可能な限り自動化することが重要です。回帰テストは、新機能の開発と並行して行うべきです。特に複数のプラットフォームをターゲットにしている場合は。
回帰テストは大規模でライブゲームに最適ですが、ソフトウェアの複雑さ、変更や更新の頻度、影響を受ける機能の重要性(ミッションまたは安全に関わるシステム)などの他の要因もその必要性を決定します。
機能テスト
機能テストは、システムまたはソフトウェアアプリケーションの機能を、その機能要件に対してテストすることで評価します。システムの機能、ユーザーインターフェース、データベースの相互作用、およびその動作と機能に影響を与える他の側面をテストすることが含まれます。機能テストの目的は、システムまたはアプリケーションが顧客またはエンドユーザーから提供された要件と仕様を満たしているかどうかを確認することです。
ほとんどの単位テストは、特定の入力に基づいて正しい出力を返すかどうかをテストするために、コードを通る特定のパスに焦点を当てています。ゲームが設計された通りに動作するかどうかをテストすることはできません。
機能テストはこれに対するアプローチです。各機能または特徴は、出力が期待に応えているかどうかを確認するために、元の設計と比較されます。これには、ゲームのコントロール、ゲームプレイメカニクス、および全体的なユーザー体験のテストが含まれる場合があります。
ゲームを開発する際に機能テストを念頭に置き、「これが起こったら、あれが起こる」というアプローチでタスクを作成することが有用です。例えば、プレイヤーがスペースバーを押すと、キャラクターがジャンプする必要があります。これは、開発者に機能を実装する方法に関する指示であり、テスターがテストするための受け入れ基準でもあります。時には、機能には関連するいくつかの受け入れ基準が含まれることがあります。たとえば、機能が使用できる場合とできない場合です。しかし、一般的には単一の機能に焦点を当てるべきです。
機能テストは、要件が明確に定義され、範囲が設定されているときに最も効果的です。したがって、フリーランサーやスタジオにゲームプレイやゲームワールドの資産のコンポーネントを提供させるために役立ちます。
自動および手動の機能テストの両方を実行できます。「ブラックボックス」テスト(内部の動作を知らずにシステムをテストする)と「ホワイトボックス」テスト(内部の動作を知ってシステムをテストする)の両方を実行する必要があります。

パフォーマンステスト
パフォーマンステストは、異なるハードウェアおよびソフトウェア構成でゲームがスムーズかつ効率的に動作することを確認するためのテストを含みます。これは、プロファイリングと一般的なパフォーマンス最適化ワークフローに密接に関連しており、この実践はゲームのパフォーマンスに影響を与える可能性のあるパフォーマンスのボトルネックや問題を特定するのに役立ちます。
主要な目的は、異なる負荷条件下でシステムまたはアプリケーションのパフォーマンスを評価することです。ゲーム開発において、パフォーマンステストは、ゲームが許容できるパフォーマンス、フレームレート、応答性、安定性で動作し、メモリを最も効率的に使用しているかどうかを測定します。
異なるタイプのパフォーマンステストには、以下が含まれます:
- ロードテスト:ゲームが重い負荷にさらされたときのパフォーマンスを決定します。
- ストレステスト:ゲームがプレイヤーの活動の急増などの予期しない状況にどのように対処するかを評価します。
- エンデュランステスト:ゲームが長時間にわたってどのようにパフォーマンスを発揮するかを評価します。
Unity プロファイラー
Unity の プロファイラー ツールは、ゲームを開発する際のパフォーマンスを分析するのに役立ちます。これは、エディター内で開発中の概要を提供するか、ケーブルまたはローカルネットワーク経由でマシンに接続された任意のデバイス上で動作し、ターゲットデバイス上でゲームがどのように動作するかの正確な分析を提供します。
プロファイラーは、キャプチャしたいデータの種類と、プロファイラーウィンドウに視覚的に表示される方法をカスタマイズするために拡張できます。
プロファイラーのカスタマイズについては、Unite 2022 セッション「Unity プロファイラーでパフォーマンスメトリクスをカスタマイズする方法」で詳しく学びましょう。
自分自身のツールを作成して、自動パフォーマンステストを行うこともできます。これに関する興味深い議論については、Unite 2022 からの Monument Valley 開発者、ustwo Games のトークを見てみてください:「アルバを作る:パフォーマンスの高いオープンワールドゲームを構築する方法。」

A/B テスト
テストは、バグを見つけたりパフォーマンスを監視したりすることに限られません。時には、プレイヤーからのエンゲージメントがより高く、パフォーマンスが良いゲーム機能の2つのバージョンを比較したい場合があります。これを A/B テスト と呼びます。
A/B テストは、ゲームのバランスに影響を与えるキャラクターや武器の統計を変更するのに役立ちますが、ゲームメカニクスは変更されません。他の例としては、異なるチュートリアル、ゲームメカニクス、またはユーザーインターフェースの効果を比較するために実施されたテストが考えられます。2つのグループから収集したデータを分析することで、どのバージョンのゲームまたは機能がより効果的であるかを特定し、最終製品に組み込む変更についてデータに基づいた意思決定を行うことができます。
A/B テストは、プレイヤーを2つのグループにランダムに割り当てることを含みます:1つのグループはゲームまたは機能の元のバージョン(コントロールグループ)をプレイし、もう1つのグループはゲームまたは機能の修正されたバージョン(実験グループ)をプレイします。
重要なのは、異なる変更によって小さなプレイヤーのコホートがどのように影響を受けたかに関するデータを収集し、どのアプローチを広範なアップデートとしてリリースするかの設計決定を行うのに役立てることです。
A/B テストは、ユーザーエクスペリエンスを改善し、プレイヤーのエンゲージメントとリテンションを向上させるのに役立ちます。特に大規模なユーザーベースを持つゲームにとって有用であり、ユーザーエンゲージメントやリテンションの小さな改善でも大きな影響を与える可能性があります。
A/Bテストは通常、バックエンドサービスとして提供され、プレイヤーは異なるバリアントを使用していることに気づくことすらありません。Unity Gaming Services (UGS) には、ゲーム内で A/B テストを実行するのに役立つツールがあり、詳細はこちらで学ぶことができます。また、UGSユースケースをチェックして、ゲーム内で A/B テストを設定する方法のサンプルを探ることができます。
診断テストツール
Cloud Diagnostics Advancedは、Unityと統合され、開発者にゲーム内のクラッシュや例外に関する詳細情報を提供する、Backtraceによって動作するクラッシュレポートおよび分析ツールです。クラッシュが発生すると、Cloud Diagnostics Advancedは、クラッシュ時のゲームの状態のスナップショットをキャプチャし、環境、コールスタック、ヒープ、レジスタに関する情報を含みます。このスナップショットはBacktraceサーバーに送信され、クラッシュの根本原因を特定するために分析されます。
Cloud Diagnostics Advancedは、詳細な分析およびレポートツールも提供しており、ゲームのパフォーマンスや安定性のトレンドやパターンを特定するのに役立ちます。重複排除アルゴリズムは、コード内の根本原因によって一般的なクラッシュをクラスタリングし、最も多くのプレイヤーの安定性を向上させるために最初に修正すべきエラーを優先するのに役立ちます。
ゲーム開発者のためのさらなる品質保証リソース
どのテスト技術を使用する場合でも、ゲームをテストする方法についての計画を立て、テストが開発プロセスの不可欠な部分であることを確認することが重要です。これらの技術の組み合わせを使用することで、Unityゲームが最高の品質であり、製品化の準備が整っていることを保証できます。
プログラマー向けの新しい電子書籍シリーズがUnityから無料で提供されています。各ガイドは経験豊富なプログラマーによって執筆され、開発チームにとって重要な特定のトピックに関するベストプラクティスを提供します。
C#スタイルガイドを作成する:クリーンなコードを記述し、チームがスタイルガイドを開発するのを支援し、より一貫したコードベースを作成するためのアプローチを統一します。
ゲームプログラミングパターンでコードをレベルアップするは、SOLID原則と一般的なプログラミングパターンを使用して、Unityプロジェクトでスケーラブルなゲームコードアーキテクチャを作成するためのベストプラクティスを強調します。
ScriptableObjectsを使用してUnityでモジュラーゲームアーキテクチャを作成するは、ゲーム制作におけるScriptableObjectsの展開に関するベストプラクティスを提供します。
このシリーズは、最も経験豊富なクリエイターに実用的なヒントとインスピレーションを提供するために作成されました。しかし、これはルールブックではありません!Unityプロジェクトを構造化する方法は多くあります。各推奨事項、ヒント、パターンの利点と欠点を同僚と評価してから展開してください。
Unityのベストプラクティスハブに関する上級者向けのガイドや記事をもっと見つけてください。