Menu
CoddyTech

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

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

Игра в каждый момент времени находится в одном состоянии: ожидает игрока, запущена или завершена. Два значения 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 приведёт к ошибке компиляции, поэтому ошибка обнаружится до того, как ты нажмёшь Play.

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

challenge icon

Задание

Легко

Пересеките площадку, не касаясь лавы. Скрипты GameManager (одиночка) и Lava уже есть; добавьте в игру состояния.

  • В GameManager.cs, перед классом, объявите перечисление GameState со значениями Ready, Playing и GameOver именно в таком порядке, а также добавьте в GameManager открытое поле типа GameState с именем state. Игра начинается в состоянии Ready.
  • Пока игра находится в состоянии Ready, клавиша Space запускает игру: состояние меняется на Playing, и в журнал записывается Go!.
  • Лава вызывает HitLava(). Пока игра находится в состоянии Playing, это завершает игру: состояние меняется на GameOver, и в журнал записывается Game over. Клавиша Space не запускает игру повторно после её завершения.
  • В Player.cs клавиши со стрелками перемещают игрока только в состоянии Playing.

Нажмите Play, попробуйте перемещаться стрелками до нажатия Space, затем коснитесь лавы и нажмите Check.

Попробуйте сами

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
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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