我看过一些视频和教程,这些视频和教程主要用于Unity中创建单例对象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中实例为null的情况下,它将创建一个新的GameObject并为其分配一个GameManger组件。但是,如果不先将GameManager组件已经附加到场景中的对象上,就无法运行此操作,这使我有些困惑。
是否还有其他建议的方法,或者上述两种方法的混合?有很多有关单例的视频和教程,但是它们都相差很大,因此很难对两者进行比较,因此可以得出结论,哪种方法是最佳/首选方法。
GameManager
应该做什么,而是如何确保对象只有一个实例以及实施该实例的最佳方法的问题。