Skip to content

Latest commit

 

History

History
100 lines (73 loc) · 4.86 KB

File metadata and controls

100 lines (73 loc) · 4.86 KB

Singleton

Что это: Singleton<T> — базовый generic-класс для менеджеров и сервисов, которым нужен один активный экземпляр и единая точка доступа. Файл: Scripts/Tools/Managers/Singleton.cs, пространство имён: Neo.Tools.

Как использовать:

  1. Наследуйте свой класс от Singleton<YourType>.
  2. Поместите компонент на сцену.
  3. При необходимости переопределите Init() и вызовите base.Init().
  4. Для необязательных зависимостей используйте HasInstance или TryGetInstance(out T).

Что делает базовый класс

  • Хранит текущий экземпляр в статическом _instance.
  • В Awake() назначает экземпляр, если у объекта включён Set Instance On Awake.
  • Может автоматически создать GameObject с компонентом, если включён CreateInstance.
  • Защищает от повторной инициализации через внутренний _isInitialized.
  • Поддерживает DontDestroyOnLoad.

Публичный API

API Описание
CreateInstance Разрешает автоматическое создание экземпляра при первом обращении к I.
I Главная точка доступа к singleton-экземпляру.
IsInitialized Показывает, назначен ли экземпляр.
HasInstance Показывает, доступен ли экземпляр без форсированного поиска.
TryGetInstance(out T instance) Безопасно получает текущий экземпляр без побочных эффектов.
DestroyInstance() Уничтожает текущий singleton и очищает ссылку.

Для наследников (protected)

API Описание
IsCurrentSingletonInstance После base.Awake()true, только если этот объект и есть текущий статический экземпляр; у лишнего дубликата на сцене — false (удобно для однократной загрузки данных в «настоящем» singleton).

Когда использовать I, а когда TryGetInstance

I

Подходит, когда singleton точно обязан существовать, а его создание или поиск допустимы.

TryGetInstance(out T)

Подходит, когда зависимость опциональна:

  • pause/menu менеджер может отсутствовать;
  • интеграционный модуль не всегда добавлен на сцену;
  • вы не хотите неявного auto-find при доступе.

Это особенно полезно в компонентах, которые могут работать как с глобальным менеджером, так и без него.

Важные детали выбора экземпляра

  • При первом доступе I класс ищет все объекты типа T.
  • Из найденных выбирается первый, у которого включён Set Instance On Awake.
  • Если ни один не подходит и CreateInstance == true, создаётся новый GameObject.
  • Если на сцене несколько компонентов с включённым флагом, лишние экземпляры уничтожатся в Awake().

Пример

using Neo.Tools;
using UnityEngine;

public class MyManager : Singleton<MyManager>
{
    protected override void Init()
    {
        base.Init();
        Debug.Log("MyManager initialized.");
    }

    public void DoSomething()
    {
        Debug.Log("Work done.");
    }
}

Пример безопасного доступа:

if (MyManager.TryGetInstance(out MyManager manager))
{
    manager.DoSomething();
}

Практические рекомендации

  • Не используйте I везде по умолчанию. Для опциональных связей лучше TryGetInstance.
  • Не забывайте вызывать base.Init() в наследниках.
  • Если в сцене нужно несколько компонентов одного типа с разной ролью, только у одного должен быть включён Set Instance On Awake.

См. также