ゲームの状態
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 14/60。
ゲームは一度に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 }は、ちょうど3つの値を持つ新しい型を作ります。値はSignal.Red、Signal.Yellow、Signal.Greenと記述します。Signal型のフィールドには、そのうちの1つの値が入ります。==で比較し、=で値を変更します。Signal.Grenのようなスペルミスはコンパイルエラーになるので、「プレイ」を押す前に間違いがわかります。
enumはクラスの外で宣言されているため、どのスクリプトからもSignalを使え、歩行者のスクリプトからcrossing.CanWalk()を呼び出すこともできます。新しいenumフィールドは、最初の値で始まります。この例ではRedです。Inspectorでは、publicなenumフィールドは値のドロップダウンリストとして表示されます。内部では、各値は0から数えた数値です。(int)Signal.Greenは2です。
チャレンジ
簡単溶岩渡りに3つの状態を設定します。
- GameManagerクラスの上に
public enum GameState { Ready, Playing, GameOver }を宣言し、その中にpublic GameState state;を宣言します。 Update()では、Readyの間、Spaceキーを押すとPlayingに設定し、Go!をログに記録します。HitLava()では、Playingの間、GameOverに設定し、Game overをログに記録します。Player.csでは、GameManager.Instance.state == GameState.Playingの間だけ矢印キーの入力を読み取ります。
「プレイ」を押します。矢印キーはSpaceキーを押すまで待機します。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
// ここで GameState 列挙型を宣言する: 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 をログに出力する
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド