Menu
CoddyTech

Состояния игры

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 14 из 60.

Игра в каждый момент времени находится в одном состоянии: ожидает игрока, запущена или завершена. Два значения типа bool, например isPlaying и isOver, по ошибке могут одновременно оказаться равными 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. Поле типа Signal в каждый момент содержит одно из них; сравнивать его можно с помощью ==, а изменять — с помощью =. Опечатка Signal.Gren вызовет ошибку компиляции, поэтому ошибка обнаружится до нажатия кнопки «Играть».

Перечисление объявлено вне класса, поэтому его могут использовать любые скрипты, а скрипт пешехода может вызывать crossing.CanWalk(). Новое поле перечисления получает первое значение — в данном случае Red. В Inspector публичное поле перечисления отображается как раскрывающийся список его значений. Внутри каждому значению соответствует число, начиная с 0: (int)Signal.Green равно 2.

challenge icon

Задание

Легко

Задай три состояния для перехода через лаву.

  1. Объяви public enum GameState { Ready, Playing, GameOver } над классом GameManager, а в нём — 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;
    // публичное поле типа GameState с именем state

    void Awake()
    {
        Instance = this;
    }

    void Update()
    {
        // В состоянии Ready нажатие Space запускает игру и выводит в журнал Go!
    }

    public void HitLava()
    {
        // В состоянии Playing игра заканчивается: выведите в журнал Game over
    }
}

Все уроки раздела Создание настоящих игр

Потренируйтесь самостоятельно: Песочница Unity