Menu
CoddyTech

Одиночка

Часть раздела Создание настоящих игр путешествия по 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 показано, как этого избежать.

challenge icon

Задание

Легко

Метеоры падают с неба. 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;
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр