Состояния игры
Часть раздела Создание настоящих игр путешествия по 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.
Задание
ЛегкоЗадай три состояния для перехода через лаву.
- Объяви
public enum GameState { Ready, Playing, GameOver }над классом GameManager, а в нём —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;
// публичное поле типа GameState с именем state
void Awake()
{
Instance = this;
}
void Update()
{
// В состоянии Ready нажатие Space запускает игру и выводит в журнал Go!
}
public void HitLava()
{
// В состоянии Playing игра заканчивается: выведите в журнал Game over
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: Бесконечный раннер
Три полосыПрепятствия впередиПотренируйтесь самостоятельно: Песочница Unity