Menu
CoddyTech

游戏状态

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 14 课,共 60 课。

游戏一次只能处于一种状态:等待玩家、运行中或结束。像 isPlaying 和 isOver 这样的两个 bool 可能会因错误而同时为 true,而像 "Playng" 这样的字符串可以通过编译,却永远无法匹配。C# 提供了一种表示固定选项列表的类型,即枚举。这个人行横道信号灯使用了枚举:

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。Signal 字段一次保存其中一个值;你可以用 == 对它进行比较,用 = 修改它。拼错成 Signal.Gren 会导致编译错误,因此你还没按下“开始”,就能发现这个错误。

枚举声明在类的外部,因此每个脚本都能使用 Signal,行人的脚本也可以调用 crossing.CanWalk()。新的枚举字段会从第一个值开始,这里是 Red。在 Inspector 中,公共枚举字段会显示为包含各个值的下拉列表。在底层,每个值都是从 0 开始计数的数字:(int)Signal.Green 的值是 2。

challenge icon

挑战

简单

为熔岩穿越设置三种状态。

  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 在线编辑器