Я видел несколько видео и учебных пособий по созданию одноэлементных объектов в 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
которого, даже если это случается (или должно происходить только один раз), кажется, что это может быть очень неоптимизировано, так как сцены увеличиваются в размерах во время разработки.
Кроме того, первый подход помечает объект как не подлежащий удалению, когда приложение меняет сцену, что обеспечивает сохранение объекта между сценами. Второй подход, кажется, не придерживается этого.
Второй подход кажется странным, так как в случае, когда экземпляр является нулевым в получателе, он создаст новый GameObject и назначит ему компонент GameManger. Однако это не может быть выполнено без предварительного подключения этого компонента GameManager к объекту в сцене, поэтому это вызывает у меня некоторую путаницу.
Есть ли какие-либо другие подходы, которые будут рекомендованы, или гибрид двух вышеупомянутых? Существует множество видео и учебных пособий, касающихся синглетонов, но все они отличаются настолько, что трудно провести какие-либо сравнения между ними и, следовательно, сделать вывод о том, какой из них является наилучшим / предпочтительным подходом.
GameManager
нужно делать, а в том, как обеспечить наличие только одного экземпляра объекта и как лучше это обеспечить.