テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】ゲームの進行をコルーチンで制御する

Tanks!のプロジェクトを眺めていた所、ゲームの進行に面白い書き方をしていたのでメモします。

f:id:tsubaki_t1:20151016220103p:plain

https://www.assetstore.unity3d.com/jp/#!/content/46209

Tanksのゲームの流れ

Tanksのゲームの流れはシンプルです。

  1. ゲームの開始時、敵の戦車と味方の戦車をセットアップ
  2. ゲーム開始の「Round表示」。このとき数秒停止
  3. ゲーム開始、
    お互いに戦車砲で撃ち合う
  4. HPが0になった戦車は爆発四散する
  5. 勝者が表示され、その画面で数秒停止する
  6. 戦車の位置を戻し再戦(Round表示に戻る)
    5ラウンド先取で勝者を表示し数秒停止

f:id:tsubaki_t1:20151016221001p:plain

f:id:tsubaki_t1:20151016221019p:plain

f:id:tsubaki_t1:20151016221044p:plain

f:id:tsubaki_t1:20151016221102p:plain

ゲームとしては一般的な流れのように思いますが、幾つかある「数秒停止する」が地味に面倒くさいです。

これをTanksはコルーチンで解決していました。

Tanksのゲーム進行を制御するコード

Tanksのゲーム進行コードは大体こんな感じです。

private IEnumerator GameLoop ()
{
    // ラウンド表示
    yield return StartCoroutine (RoundStarting ());
    // どちらかの戦車が消滅するまで戦う
    yield return StartCoroutine (RoundPlaying());
    // 勝者表示
    yield return StartCoroutine (RoundEnding());

    if (m_GameWinner != null)
    {
        Application.LoadLevel (Application.loadedLevel);
    }
    else
    {
        StartCoroutine (GameLoop ());
    }
}

 RoundStartingRoundEndingはシンプルに WaitForSecondsを使用していますが、RoundPlayingは「どちらかが死ぬ判定が出るまで無限ループ」でチェックしていました。

コルーチンはこういった進行管理を制御するのに便利ですね。スクリプトデバッガで止められますし。

tsubakit1.hateblo.jp