Skip to content

Latest commit

 

History

History
126 lines (82 loc) · 6.14 KB

File metadata and controls

126 lines (82 loc) · 6.14 KB

SingletonById — синглтон по уникальному Id

Что это: Поля в коде: _id, _dontDestroyOnLoad (сериализуемые). Публичное свойство Id только для чтения.

Как использовать: см. разделы ниже.


1. Введение

SingletonById<T> — базовый класс для объектов, которых в игре может быть несколько разных типов, но по одному экземпляру на каждый уникальный Id. В отличие от обычного Singleton<T> (один экземпляр на весь проект), здесь один экземпляр на Id: например, один менеджер с Id "Music", другой с Id "SFX" и т.д.

Подходит для:

  • нескольких «синглтонов» одного и того же типа с разными ролями (по Id);
  • объектов, которые должны переезжать между сценами (опция DontDestroyOnLoad) и при этом не дублироваться по Id.

Правило при совпадении Id: если уже существует экземпляр с таким Id, при появлении нового уничтожается предыдущий (остаётся новый). Так при загрузке сцены с тем же Id новый объект заменяет старый.


2. Класс

  • Пространство имён: Neo.Tools
  • Файл: Assets/Neoxider/Scripts/Tools/Managers/SingletonById.cs

Особенности

  • Один экземпляр типа T на каждый уникальный строковый Id.
  • При появлении второго объекта с тем же Id старый уничтожается (побеждает новый).
  • Опция DontDestroyOnLoad — объект не уничтожается при смене сцен.
  • Доступ по Id через статический метод Get(id).
  • Регистрация в Awake, снятие с регистрации в OnDestroy.

3. Настройки (Inspector)

Поле Тип Описание
Id string Уникальный идентификатор (например "Music", "SFX"). Не оставлять пустым.
DontDestroyOnLoad bool Если включено, объект не уничтожается при загрузке новых сцен.

Поля в коде: _id, _dontDestroyOnLoad (сериализуемые). Публичное свойство Id только для чтения.


4. Статические методы и свойства

API Описание
Get(string id) Возвращает экземпляр T с данным Id или null.
Has(string id) Возвращает true, если есть живой экземпляр с данным Id.

5. Виртуальные методы

Переопределяйте при необходимости:

  • Awake() — вызывается после регистрации (и опционально DontDestroyOnLoad). Вызовите base.Awake() если переопределяете.
  • OnDestroy() — вызывается при уничтожении; снятие с регистрации делается в базовом классе. Вызовите base.OnDestroy() если переопределяете.

6. Пример использования

Объявление своего менеджера по Id

using Neo.Tools;
using UnityEngine;

public class AudioChannel : SingletonById<AudioChannel>
{
    [SerializeField] private AudioSource _source;

    public void Play(AudioClip clip)
    {
        if (_source != null)
            _source.PlayOneShot(clip);
    }
}

Настройка в сцене

  1. Создайте GameObject, добавьте компонент AudioChannel.
  2. В Inspector задайте Id (например "Music" или "SFX").
  3. При необходимости включите DontDestroyOnLoad.

Доступ из кода

// Получить канал по Id
var music = AudioChannel.Get("Music");
var sfx = AudioChannel.Get("SFX");

if (music != null)
    music.Play(someClip);

if (AudioChannel.Has("Music"))
    Debug.Log("Music channel exists.");

Поведение при совпадении Id

  • В сцене два объекта с компонентом AudioChannel и Id "Music". При запуске первый регистрируется, второй при своём Awake уничтожит первый и зарегистрируется сам — останется один с Id "Music".
  • Объект с DontDestroyOnLoad и Id "Music" уже есть; загружается сцена, в которой тоже есть объект с Id "Music". После загрузки у «старого» вызовется уничтожение (его уничтожит новый при своём Awake), останется экземпляр из новой сцены.

7. Сравнение с Singleton<T>

Singleton<T> SingletonById<T>
Экземпляров типа T Всегда один на проект Один на каждый Id
Доступ MyManager.I MyManager.Get("id")
Дубликат Второй уничтожается (остаётся первый) При том же Id старый уничтожается (остаётся новый)
Использование Один глобальный менеджер Несколько «синглтонов» по ролям (Id)

8. Связанные компоненты

  • Singleton<T&gt — один экземпляр на весь проект: Singleton.md.