Один скрипт управляет игрой
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 12 из 56.
Помести счёт в скрипт игрока, жизни — в скрипт здоровья, а проверку окончания игры — в третий скрипт, и каждому скрипту нужны числа из других, поэтому каждое новое правило затрагивает несколько файлов. В играх на Unity эти числа обычно передают одному скрипту — GameManager, который находится на отдельном пустом GameObject. Он отвечает за счёт, жизни и правило окончания игры. Другие скрипты лишь сообщают о произошедшем, вызывая его публичные методы. В этой серии пенальти ворота сообщают о каждом голе:
public class GameManager : MonoBehaviour
{
private int goals;
private int shotsLeft = 5;
public void ShotTaken(bool scored)
{
if (shotsLeft == 0) return;
shotsLeft--;
if (scored) goals++;
Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
}
}// Net.cs, на триггере ворот
public GameManager game;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball")) game.ShotTaken(true);
}Ворота не знают, сколько ударов осталось и когда заканчивается игра. Они сообщают о голе, а менеджер решает, что это значит; скрипт вратаря сообщает об отражённом ударе с помощью game.ShotTaken(false). Для серии из 3 ударов нужно изменить одно число в одном скрипте. Проверка в начале ShotTaken не даст мячу, закатившемуся в ворота после финального свистка, засчитаться.
Заполни поле game в Inspector, перетащив на него объект GameManager, и Unity найдёт скрипт GameManager на этом объекте. Менеджер также отвечает за HUD: когда он хранит текст счёта и панель окончания игры, экран обновляется тем же методом, который изменяет числа, и никакой другой скрипт не обращается к интерфейсу.
Задание
ЛегкоОхота за драгоценными камнями. Стрелки перемещают Player (его скрипт уже готов). За драгоценные камни начисляются очки, равные их points, бомбы отнимают жизнь, а GameManager управляет всем этим. В Inspector уже связаны поле game каждого драгоценного камня и каждой бомбы с объектом GameManager, а поля GameManager — с HUD и Player.
В GameManager.cs:
AddScore(int points)добавляет очки кscoreи показывает их вscoreTextв видеScore: 6.LoseLife()уменьшаетlivesна 1 (в начале их 3) и показывает их вlivesTextв видеLives: 2.- Когда значение
livesдостигает 0, игра заканчивается: покажиgameOverPanelи отключи скрипт Player, чтобы стрелки перестали работать. После этогоAddScoreничего не меняет.
В Gem.cs и Bomb.cs: когда Player (с тегом Player) касается драгоценного камня или бомбы, объект сообщает об этом игре (драгоценный камень передаёт свои points, бомба — о потерянной жизни) и удаляет себя.
Нажми Play, собери драгоценные камни и коснись бомб, затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text scoreText;
public TMP_Text livesText;
public GameObject gameOverPanel;
public Player player;
private int score;
private int lives = 3;
private bool gameOver;
public void AddScore(int points)
{
// добавить очки и отобразить новый счёт, если игра ещё не окончена
}
public void LoseLife()
{
// отнять одну жизнь и отобразить оставшиеся жизни; при 0 жизней игра окончена
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: бесконечный раннер
Три полосыПрепятствия впереди