Tanks!のプロジェクトを眺めていた所、ゲームの進行に面白い書き方をしていたのでメモします。
https://www.assetstore.unity3d.com/jp/#!/content/46209
Tanksのゲームの流れ
Tanksのゲームの流れはシンプルです。
- ゲームの開始時、敵の戦車と味方の戦車をセットアップ
- ゲーム開始の「Round表示」。このとき数秒停止
- ゲーム開始、
お互いに戦車砲で撃ち合う - HPが0になった戦車は爆発四散する
- 勝者が表示され、その画面で数秒停止する
- 戦車の位置を戻し再戦(Round表示に戻る)
5ラウンド先取で勝者を表示し数秒停止
ゲームとしては一般的な流れのように思いますが、幾つかある「数秒停止する」が地味に面倒くさいです。
これを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 ());
}
}
RoundStarting
とRoundEnding
はシンプルに WaitForSecondsを使用していますが、RoundPlaying
は「どちらかが死ぬ判定が出るまで無限ループ」でチェックしていました。
コルーチンはこういった進行管理を制御するのに便利ですね。スクリプトデバッガで止められますし。