Menu
CoddyTech

ゲームの状態

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です。

challenge icon

チャレンジ

簡単

溶岩渡りに3つの状態を設定します。

  1. GameManagerクラスの上にpublic enum GameState { Ready, Playing, GameOver }を宣言し、その中にpublic GameState state;を宣言します。
  2. Update()では、Readyの間、Spaceキーを押すとPlayingに設定し、Go!をログに記録します。HitLava()では、Playingの間、GameOverに設定し、Game overをログに記録します。
  3. 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プレイグラウンド