主に、Unityでシングルトンオブジェクトを作成するためのいくつかのビデオとチュートリアルを見てきましたGameManager
。これらは、シングルトンのインスタンス化と検証にさまざまなアプローチを使用しているようです。
これに対する正しい、またはむしろ好ましいアプローチはありますか?
私が遭遇した2つの主な例は次のとおりです。
最初
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;
}
}
2つの間に見られる主な違いは次のとおりです。
最初のアプローチでは、ゲームオブジェクトスタックをナビゲートして、GameManager
開発中にシーンのサイズが大きくなると非常に最適化されない可能性があると思われるインスタンスを見つけようとします。
また、最初のアプローチは、アプリケーションがシーンを変更したときにオブジェクトが削除されないようにマークします。これにより、オブジェクトがシーン間で保持されます。2番目のアプローチはこれに準拠していないようです。
2番目のアプローチは奇妙です。ゲッターでインスタンスがnullの場合、新しいGameObjectを作成し、それにGameMangerコンポーネントを割り当てます。ただし、このGameManagerコンポーネントがシーン内のオブジェクトに既にアタッチされていないと、これを実行できません。そのため、混乱が生じています。
推奨される他のアプローチ、または上記の2つのハイブリッドがありますか?シングルトンに関するビデオやチュートリアルはたくさんありますが、それらはすべて大きく異なるため、2つの比較を行うのは難しいため、どちらが最良/推奨アプローチであるかについての結論を導き出します。
GameManager
すべきかという問題ではなく、オブジェクトのインスタンスが1つだけであることを保証する方法と、それを実施する最良の方法です。