ゲームの状態
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 14/56。
ゲームは一度に1つの状態になります。プレイヤーを待っている、実行中、または終了です。isPlayingやisOverのようなboolを2つ使うと、誤って両方がtrueになってしまうことがあります。また、"Playng"のような文字列はコンパイルできても一致することはありません。C#には、選択肢の固定リストを表す型、enumがあります。この横断歩道の信号では、次のように使います。
public enum Signal { Red, Yellow, Green }
public class Crossing : MonoBehaviour
{
public Signal signal;
void Update()
{
if (signal == Signal.Red && Input.GetMouseButtonDown(0))
{
signal = Signal.Green;
Debug.Log("Walk!");
}
}
public bool CanWalk()
{
return signal == Signal.Green;
}
}enum Signal { Red, Yellow, Green }は、Signal.Red、Signal.Yellow、Signal.Greenと表記する、ちょうど3つの値を持つ新しい型を作ります。Signalフィールドは一度にそのうちの1つを保持し、==で比較し、=で変更します。Signal.Grenのようなスペルミスはコンパイルエラーになるため、Playを押す前に間違いがわかります。
enumはクラスの外で宣言されているため、どのスクリプトからもSignalを使うことができ、歩行者のスクリプトからcrossing.CanWalk()を呼び出せます。新しいenumフィールドは、ここではRedという最初の値から始まります。Inspectorでは、publicのenumフィールドは値のドロップダウンリストとして表示されます。内部では、各値は0から数えた数値です。(int)Signal.Greenは2です。
チャレンジ
簡単溶岩に触れずに床を渡りましょう。GameManager(シングルトン)とLavaスクリプトは用意されています。ゲームに状態を設定しましょう。
GameManager.csで、クラスの上に、値が順にReady、Playing、GameOverの列挙型GameStateを宣言し、GameManagerにGameState型のstateというpublicフィールドを追加します。ゲームはReady状態で開始します。- ゲームがReady状態の間にSpaceキーを押すと開始します。状態がPlayingになり、
Go!がログに出力されます。 - Lavaは
HitLava()を呼び出します。ゲームがPlaying状態の間にこれが呼び出されると、ゲームが終了します。状態がGameOverになり、Game overがログに出力されます。終了したゲームはSpaceキーを押しても再開しません。 Player.csでは、状態がPlayingの間だけ矢印キーでプレイヤーを動かせるようにします。
Playを押し、Spaceキーを押す前に矢印キーを試してから、溶岩に向かって歩き、最後にCheckを押します。
自分で試してみよう
using UnityEngine;
// ここで GameState enum を宣言する: Ready, Playing, GameOver
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
// state という名前の public な GameState フィールド
void Awake()
{
Instance = this;
}
void Update()
{
// Ready の間、Space キーでゲームを開始し、Go! をログに出力する
}
public void HitLava()
{
// Playing の間、ゲームを終了し、Game over をログに出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。