見出し画像

ゲーム開発時にあると便利なデバッグ機能

今回はゲーム開発時にあると便利なデバッグ機能を紹介します。

■デバッグ機能の分類

ゲーム開発中にあると便利なデバッグ機能はおおよそ以下の3つに分かれると思います。

1. エディット系
2. パフォーマンス測定
3. バグの検証・再現

■1, エディット系

これはゲームデータをゲームプレイ中にリアルタイム編集して、ゲームへ直接反映させるものです。例としては以下のものがあります。

* フラグ編集、パラメータの編集
* アイテムやお金の増減
* 無敵モード・コリジョン無効
* ゲームオブジェクト(プレイヤー、敵、アイテム)を好きな場所にワープ
* ゲーム実行中にマップに何でも(地形、敵、アイテム)配置できる

RPGであればイベント回りで大量のフラグを扱うので、フラグ編集機能は必須となります。またキャラクターステータスを編集したり、任意のレベルに変更する機能は是非とも欲しいところです。アイテムやお金の増減もほぼ必須ですね。
HPが0になっても死亡しない、もしくはダメージを受けないなどの "無敵モード"、コリジョンを無効にして自由に移動できるようにすると、動作チェックに集中できて良いです。
探索ゲームやアクションゲームでは、例えばクリックしたところにワープできるようにすると、テストしたい場所にすぐ移動できてデバッグ作業が捗ります。さらにはクリックすると壁を壊したり配置できたり、敵を自由に配置できると敵の攻撃やAIのチェックができ、アイテムを配置できればアイテム獲得のテストができます。
なお、セーブデータをテキストデータ(INIファイル、JSONファイル)にすると、可読性が高くバグの原因究明がやりやすくなったり、テストデータを作りやすくなるのでオススメです。ただセーブデータの改ざんを防ぐ必要がある場合はデバッグ時のみ有効にします。

■2. パフォーマンス測定

ゲームが安定して動作するかどうか、または十分なパフォーマンスが出ているかどうかを測定する場合には、以下の機能があると良いです。

* ロード中の画像リソース表示
* フレームレート(FPS)
* CPU / GPU使用率
* メモリダンプ、オブジェクトダンプ

ロード中の画像リソースを1枚ずつ表示できる機能があると、画像がうまく出ない場合に正しくコンバートできて読み込みができているかどうか確認しやすいです。また画像リソースが正しく解放できているかどうかも確認できますね。
あとリアルタイムゲームであれば、フレームレート(FPS)が目標となる値をキープできてるかの表示はほぼ必須ですね、計測可能であrば、CPU / GPU使用率を表示する機能を作っても良いです。
あとメモリの入れ替えが頻繁に発生するゲームであれば、確保しているメモリやゲームオブジェクトをデバッグ出力、もしくはゲームオブジェクトの生存数をカウントする機能を入れておくと、メモリリークの調査が捗ります。

■3. バグの検証・再現

バグの原因を調査するには以下の機能があると便利です。

* 乱数の固定化
* スローモーション再生 (コマ送り再生)
* ゲームデータのリロード
* ステージのリスタート、ステージ選択(好きなステージから開始)
* リプレイの保存、再生
* エージング
* ログ出力(スクリプトコマンド出力)

乱数の値が常に同じ値を返すようになると、バグの再現が容易となります。
アクションゲームでは、フレームレートをわざと落とすなどしてスローモーション再生する機能を作ると、当たり判定の不具合の検証などがやりやすくなります
またゲームプレイ中にゲームデータのリロードができると、ゲームを再起動することなしに修正したマップデータやアイテムデータを反映できるので、起動に時間のかかるゲームや再現までに時間がかかる場合に役立ちます。
ステージのリスタートが簡単にできると、ゲーム再起動の待ち時間を減らすことができます
ルールの複雑なテーブルゲーム、リソースの種類が多いシミュレーションゲーム、ネットワークゲームでは、不具合の再現が難しい場合があります。その場合にリプレイ機能を使ってバグを100%再現できると原因の特定が容易となります。リプレイ機能は入力情報の差分を取る方法で実装できます。

▼リプレイに保存する情報
1フレーム目:右キーを入力し続けている
10フレーム目:ジャンプボタンを入力した
30フレーム目:右キーを離した
35フレーム目:左キーを入力し続けている
……

これらの情報をファイルに書き込み、リプレイする場合はこの手順通りに再生します。なお、乱数がゲームに影響する場合は乱数のシード値を固定化する必要があります。
エージングというのは長時間の稼働テストですが、ゲームの場合は自動テストという意味でも扱われます。どういうものかというと、ある程度決まった手順を繰り返すことで特定のタイミングや条件でしか発生しない不具合を再現するためのテストとして使います。
私が過去に関わったプロジェクトでも、ネットワーク対戦のあるゲームでエージングを続けることで多くの不具合を発見できましたし、規模の大きいRPGでも滅多に出ないメモリリークを発見するのに役立ちました。ただエージングの場合はそれまでの手順をずっと見ているのも大変なので、処理の流れを特定するためのログを書き出すことが必要となります。

この記事が気に入ったらサポートをしてみませんか?