Куда прикреплять глобальные скрипты в Unity?

14

Насколько я знаю в Unity, каждый скрипт должен быть привязан к объекту. Но как обстоят дела с глобальными скриптами? Например, в тетрисоподобной игре к какому объекту я должен прикрепить скрипты элемента spawner и mover? Или элемент должен обрабатывать свое движение для себя? Есть ли лучшая практика для этой проблемы?

nosferat
источник

Ответы:

14

Чтобы расширить ответ Тетрада, рассмотрим такой сценарий:

public class GameSystem : MonoBehavior
{
  private GameSystem m_Instance;
  public GameSystem Instance { get { return m_Instance; } }

  void Awake()
  {
    m_Instance = this;
  }

  void OnDestroy()
  {
    m_Instance = null;
  }

  void Update()
  {
    // global game update logic goes here
  }

  void OnGui()
  {
    // common GUI code goes here
  }

  // etc.
}

Затем вы можете создать объект под названием «GameSystem» в корне вашей сцены. Единственными компонентами, которые он имел бы, был бы встроенный компонент преобразования (установите его положение в начало координат, поворот в единицу и масштаб в единицу; не то, чтобы это имело значение, но это хорошая практика). Прикрепил компонент GameSystem к этому объекту.

Теперь вы можете получить доступ к своему глобальному объекту, просто используя GameSystem.Instance.blah (). Его методы-обработчики событий вызываются автоматически Unity, поскольку он является производным от MonoBehavior и существует как компонент. Вы можете добавить к нему поля, которые ссылаются на другие игровые объекты или компоненты, и соединить их в представлении иерархии объектов Unity.

Да, все это немного "странно". Может показаться немного грязным создание объекта (который даже имеет преобразование), который всегда является просто глобальным синглтоном. Это то, что требуется Unity для создания глобальных объектов, которые получают сообщение об обновлении и могут работать с редактором свойств Unity по умолчанию.

Шон Миддледич
источник
Спасибо за этот ответ. Я согласен, что это странно! и думаю, что есть очень мало информации об этой стороне вещей. Не могли бы вы порекомендовать материалы для чтения о том, как лучше всего подойти к этим классам типа «менеджер» в единстве?
UpTheCreek
@UpTheCreek: я действительно не знаю ни одного. В основном мы выяснили все это на работе пару лет назад, но наши текущие проекты основаны на нестандартных технологиях, поэтому в настоящее время я немного устарел в использовании лучших практик Unity. Сожалею.
Шон Мидлдич
3

Просто создайте объект менеджера, на который вы поместите этот скрипт. Возможно, создайте статическую переменную для того сценария, который вы назначаете, Awakeчтобы иметь легкий глобальный доступ к нему.

тетрада
источник