Один скрипт управляет игрой
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 12 из 60.
Поместите счёт в скрипт игрока, жизни — в скрипт здоровья, а проверку окончания игры — в третий скрипт. Тогда каждому скрипту нужны данные остальных, и каждое новое правило затрагивает несколько файлов. В играх на 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: если он хранит текст счёта и панель окончания игры, экран меняется в том же методе, где меняются числа, и никакой другой скрипт не взаимодействует с интерфейсом.
Задание
ЛегкоПусть GameManager ведет учет очков и жизней.
AddScore(int points): еслиgameOverне установлено, добавь значение кscoreи отобразиScore: 6вscoreText.LoseLife(): уменьшиlivesна 1 и отобразиLives: 2; при значении 0 установиgameOver, покажиgameOverPanel, установиplayer.enabled = false.- В
GemиBomb, когда выполняетсяother.CompareTag("Player"), вызовиgame.AddScore(points)илиgame.LoseLife(), затемDestroy(gameObject).
Нажми «Играть» и столкнись с тремя бомбами. Затем нажми «Проверить».
Попробуйте сами
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Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: Бесконечный раннер
Три полосыПрепятствия впередиПотренируйтесь самостоятельно: Песочница Unity