Реализация шаблона Singleton в Unity: подробное руководство

При разработке игр на Unity обычно используется шаблон Singleton, чтобы гарантировать, что класс будет иметь только один экземпляр на протяжении всего выполнения игры. Синглтоны полезны, когда вам нужно получить доступ к определенному объекту из нескольких скриптов или когда вы хотите поделиться данными или функциями в разных частях вашей игры. В этой статье мы рассмотрим несколько методов реализации шаблона Singleton в Unity, а также приведем примеры кода для каждого подхода.

Метод 1: простая реализация Singleton
Пример кода:

public class SingletonExample : MonoBehaviour
{
    private static SingletonExample instance;
    private void Awake()
    {
        if (instance != null && instance != this)
        {
            Destroy(this.gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
// Rest of the class implementation...
}

Метод 2: ленивая инициализация
Пример кода:

public class SingletonExample : MonoBehaviour
{
    private static SingletonExample instance;
    public static SingletonExample Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<SingletonExample>();
                if (instance == null)
                {
                    GameObject singletonObject = new GameObject();
                    instance = singletonObject.AddComponent<SingletonExample>();
                    DontDestroyOnLoad(singletonObject);
                }
            }
            return instance;
        }
    }
// Rest of the class implementation...
}

Метод 3: потокобезопасный одноэлементный элемент
Пример кода:

public class SingletonExample : MonoBehaviour
{
    private static SingletonExample instance;
    private static object lockObject = new object();
    public static SingletonExample Instance
    {
        get
        {
            lock (lockObject)
            {
                if (instance == null)
                {
                    instance = FindObjectOfType<SingletonExample>();
                    if (instance == null)
                    {
                        GameObject singletonObject = new GameObject();
                        instance = singletonObject.AddComponent<SingletonExample>();
                        DontDestroyOnLoad(singletonObject);
                    }
                }
                return instance;
            }
        }
    }
// Rest of the class implementation...
}

Метод 4: синглтон со сценарным объектом
Пример кода:

[CreateAssetMenu(fileName = "SingletonExample", menuName = "Singletons/SingletonExample")]
public class SingletonExample : ScriptableObject
{
    private static SingletonExample instance;
    public static SingletonExample Instance
    {
        get
        {
            if (instance == null)
            {
                instance = Resources.Load<SingletonExample>("SingletonExample");
            }
            return instance;
        }
    }
// Rest of the class implementation...
}

В этой статье мы рассмотрели различные методы реализации шаблона Singleton в Unity. В зависимости от ваших конкретных требований и структуры проекта вы можете выбрать наиболее подходящий подход. Шаблон Singleton гарантирует, что существует только один экземпляр класса, обеспечивая легкий доступ к общим функциям и данным на протяжении всей игры. Следуя предоставленным примерам кода, вы сможете успешно реализовать синглтоны в своих проектах Unity, а также улучшить организацию кода и возможность его повторного использования.