游戏状态
本课属于 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。
挑战
简单为熔岩穿越设置三种状态。
- 在 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 在线编辑器