Одиночка
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 13 из 56.
Для ссылки из Inspector нужен объект, на который можно перетащить ссылку. Враги, которых спавнер создаёт во время игры, появляются из префаба, а префаб может ссылаться только на ресурсы и собственные части, но никогда — на объект в сцене, поэтому его поле GameManager пустое. Обычно для этого используют синглтон: GameManager сохраняет себя в поле, к которому может обратиться любой скрипт по имени класса.
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private int kills;
void Awake()
{
Instance = this;
}
public void EnemyDown()
{
kills++;
Debug.Log("Kills: " + kills);
}
}// Enemy.cs, на префабе врага
public void Die()
{
GameManager.Instance.EnemyDown();
Destroy(gameObject);
}static означает, что поле принадлежит классу, а не объекту. У каждого объекта GameManager было бы своё поле kills, но во всей игре есть только один Instance, и обратиться к нему можно по имени класса: GameManager.Instance. Любой скрипт может прочитать это поле, в том числе враг, созданный минуту назад, которому не нужно заполнять собственное поле.
Менеджер задаёт Instance = this; в Awake, где this — сам скрипт. Unity запускает все Awake в сцене до любого Start, поэтому другие скрипты могут использовать GameManager.Instance, начиная с их Start. Второй GameManager в сцене перезаписал бы Instance своим значением; в главе Scenes and Levels показано, как этого избежать.
Задание
ЛегкоМетеоры падают с неба. Spawner каждые 1.5 секунды сбрасывает Meteor из префаба, стрелки перемещают Player, а GameManager считает пойманные метеоры с помощью MeteorCaught(), а метеоры, ударившиеся о землю, — с помощью MeteorLanded(). Эти скрипты готовы.
Скрипт Meteor отправляет отчёт через поле game, но метеоры создаются из префаба, поэтому game не задано и каждый отчёт завершается ошибкой. Исправь это с помощью singleton:
- В
GameManager.csдобавь открытое статическое полеInstanceтипа GameManager и присвой ему этот скрипт в Awake. - В
Meteor.csудали полеgameи отправляй отчёт черезGameManager.Instance.
Нажми Play, поймай несколько метеоров и пропусти несколько, затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text caughtText;
public TMP_Text shieldText;
private int caught;
private int shield = 3;
public void MeteorCaught()
{
caught++;
caughtText.text = "Caught: " + caught;
}
public void MeteorLanded()
{
shield--;
shieldText.text = "Shield: " + shield;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: бесконечный раннер
Три полосыПрепятствия впереди