Состояния игры
Часть раздела Создание настоящих игр путешествия по 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.
Задание
ЛегкоПересеките площадку, не касаясь лавы. Скрипты 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
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: бесконечный раннер
Три полосыПрепятствия впереди