Unityと吉里吉里でSLGとかRPGを作るブログ

突然ですが、吉里吉里のデバックモードをご存知でしょうか。
吉里吉里のコンフィグツールにて設定できます。
設定方法はこちらを参照して下さい。

今回はちょっと踏み込んだ所で、動的ゲーム制作における、デバック機能活用を考えてみます。
具体的には、処理情報をコンソールへ出力し、バグの原因を解明する方法と言った感じです。


■コンソールへの出力

スクリプト内に以下の記述をする事で、
Debug.message("この内容がコンソールに出力されます");
Ctrl+F4で開くコンソールウィンドウに情報を出力する事が出来ます。

当然ですが、変数も使用可能です。
Debug.message("表示位置:" + left + "/" + top);
この場合、leftとtopが変数です。これにより以下の様な文字がコンソールに出力されます。
表示位置:100/95

ここで、更にでバックモードの時だけコンソールに出力する様に設定できます。
//デバック対応
if(System.getArgument("-debug") == "yes")
{
Debug.message("表示位置:" + left + "/" + top);
}
これで、デバックモード中のみ、コンソール出力します。


■動的ゲーム用のデバック機能

ノベルゲームとの違いとして、動的ゲームはシーケンシャルな処理とはならず、通常にデバックメッセージを出力すると、過剰に出力され、結果がわかりにくくなりがちです。
特にコンティニュアスハンドラでの処理でエラーが発生すると、原因特定に時間がかかります。
何せ、高速で処理を回転させているので、普通に出力すると、何百行とデバックメッセージが出力されてしまいます。
これらを解決する方法として、私がやっている方法を紹介します。

コンティニュアスハンドラについては、当ブログでも紹介しました。こちらをご覧下さい。
◆第12回「コンティニュアスハンドラの利用」◆


//------------------------------------
// コンティニュアスハンドラ
//------------------------------------
function handler(tickCount)
{
  try
  {
    //エフェクトの実行
    if(tickCount >= nextTime)
    {
      //次の稼働を20ミリ秒後に設定
      //20ミリなので、秒間50fps
      nextTime = tickCount + 20;
      count++;
    }

    if(tickCount >= time_d + 1000)
    {
      showFps(count);
      time_d = tickCount;
      count=0;
    }

  }
  catch(e)
  {
    // try ブロック内で例外が発生した場合はレイヤの移動を停止します
    // 再び例外を投げます
    throw e;
  }
}
コンティニュアスハンドラ内でエラーが出るとcatch(e)に処理が飛びます。
これを利用して、配列に出力内容を入れておき、エラー時にそれを出力します。
出力内容としては、直近5個のファンクションの開始と終了を入れておきましょう。

●改造後(出力箇所)
  catch(e)
  {
    //デバック対応
    if(System.getArgument("-debug") == "yes")
    {
      var i;
      for(i=0; i<start_function.count; i++)
      {
        Debug.message("★スタートファンクション[" + i + "]:" + start_function[i]);
        Debug.message("★エンドファンクション[" + i + "]:" + end_function[i]);
      }
    }
    throw e;
  }

これで、どこで何が原因で落ちたのか一目瞭然。レアケースのバグにも非常に対応しやすいです。







◆つぶつぶ主人公HP◆  ◆サンプルダウンロードの一覧◆
スポンサーサイト
2014.04.16 / Top↑
Secret

TrackBackURL
→http://nekodamasi.blog79.fc2.com/tb.php/106-381fd13e