При разработке игр на 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, а также улучшить организацию кода и возможность его повторного использования.