Я переглянув декілька відео та навчальних посібників для створення одиночних об'єктів в Unity, головним чином для a GameManager
, які, як видається, використовують різні підходи до інстанціювання та перевірки сингтона.
Чи є правильний, а точніше, кращий підхід до цього?
Два основні приклади, з якими я стикався:
Спочатку
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
_instance = GameObject.FindObjectOfType<GameManager>();
}
return _instance;
}
}
void Awake()
{
DontDestroyOnLoad(gameObject);
}
}
Друге
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
instance = new GameObject("Game Manager");
instance.AddComponent<GameManager>();
}
return _instance;
}
}
void Awake()
{
_instance = this;
}
}
Основна відмінність, яку я бачу між собою, це:
Перший підхід спробує орієнтуватися у стеці ігрових об'єктів, щоб знайти примірник того, GameManager
що, хоча це тільки відбувається (або повинно відбуватися лише один раз), здається, що це може бути дуже неоптимізовано, оскільки сцени збільшуються в розмірах під час розвитку.
Також перший підхід позначає, що об'єкт не повинен бути видалений, коли програма змінює сцену, що забезпечує збереження об'єкта між сценами. Другий підхід, схоже, цього не дотримується.
Другий підхід здається дивним, як і у випадку, коли екземпляр у getter є нульовим, він створить новий GameObject і призначить йому компонент GameManger. Однак, це не може запуститися без того, щоб цей компонент GameManager вже був приєднаний до об'єкта в сцені, тому це викликає у мене певну плутанину.
Чи є інші підходи, які були б рекомендовані, або гібрид із двох вище? Відео та навчальні посібники щодо синглів багато, але всі вони настільки різняться, що важко провести будь-яке порівняння між ними, і, таким чином, зробити висновок, який із них є найкращим / бажаним підходом.
GameManager
слід робити, а про те, як забезпечити існування лише одного примірника об'єкта та найкращого способу його виконання.