Что это: Singleton<T> — базовый generic-класс для менеджеров и сервисов, которым нужен один активный экземпляр и единая точка доступа. Файл: Scripts/Tools/Managers/Singleton.cs, пространство имён: Neo.Tools.
Как использовать:
- Наследуйте свой класс от
Singleton<YourType>. - Поместите компонент на сцену.
- При необходимости переопределите
Init()и вызовитеbase.Init(). - Для необязательных зависимостей используйте
HasInstanceилиTryGetInstance(out T).
- Хранит текущий экземпляр в статическом
_instance. - В
Awake()назначает экземпляр, если у объекта включёнSet Instance On Awake. - Может автоматически создать GameObject с компонентом, если включён
CreateInstance. - Защищает от повторной инициализации через внутренний
_isInitialized. - Поддерживает
DontDestroyOnLoad.
| API | Описание |
|---|---|
CreateInstance |
Разрешает автоматическое создание экземпляра при первом обращении к I. |
I |
Главная точка доступа к singleton-экземпляру. |
IsInitialized |
Показывает, назначен ли экземпляр. |
HasInstance |
Показывает, доступен ли экземпляр без форсированного поиска. |
TryGetInstance(out T instance) |
Безопасно получает текущий экземпляр без побочных эффектов. |
DestroyInstance() |
Уничтожает текущий singleton и очищает ссылку. |
| API | Описание |
|---|---|
IsCurrentSingletonInstance |
После base.Awake() — true, только если этот объект и есть текущий статический экземпляр; у лишнего дубликата на сцене — false (удобно для однократной загрузки данных в «настоящем» singleton). |
Подходит, когда singleton точно обязан существовать, а его создание или поиск допустимы.
Подходит, когда зависимость опциональна:
- 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.