SingletonMonoBehaviourとは?
異なるシーン間で唯一のインスタンスを維持・管理するために設計されたクラスです。
このクラスはシーン遷移に影響されず、データや設定の一貫性を保つのに役立ちます。
これだけ聞くと難しく感じるかもしれませんが、
平たく言ってしまえば「Singleton + MonoBehaviour」です。
つまり、MonoBehaviourの機能を活用しながら、
Unityのシーン間で唯一のインスタンスを管理するシングルトンを作ろうというものです。
シングルトンってなんだ?という方は、こちらの記事 を参考にしてみて下さい。
SingletonMonoBehaviourの特徴
SingletonMonoBehaviour には3つの特徴があります。
1.MonoBehaviourを継承
-> Unityのライフサイクルイベントを利用でき、DDOLの設定も可能になる。
2.シングルトンパターンの実装
-> 通常のシングルトンパターンと同様に、唯一のインスタンスを保持する。
3.DDOLに設定
-> シーン遷移時に破棄されないように設定し、ゲームを通してインスタンスを保持する。
SingletonMonoBehaviourクラスを実装する
上記3つの特徴に沿って実装したクラスがこちらです。
using UnityEngine;
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
// シングルトンのインスタンス
private static T instance;
public static T Instance
{
get
{
if(instance == null)
{
// シーン内からゲームオブジェクトを検索
instance = FindObjectOfType<T>();
if(instance == null )
{
// インスタンスが見つからなかった場合、新しいゲームオブジェクトを作成
GameObject singletonObject = new GameObject();
instance = singletonObject.AddComponent<T>();
singletonObject.name = typeof(T).ToString() + " (Singleton)";
// シーン遷移時にオブジェクトを破棄しないように設定
DontDestroyOnLoad(singletonObject);
}
}
return instance;
}
}
// Awakeメソッドで重複インスタンスをチェック
protected virtual void Awake()
{
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
先ほど紹介した記事で実装したシングルトンと共通している部分がほとんどです。
大きな違いと言えば、ジェネリックなクラスになっていることです。
これにより、あらゆるクラスに対して同じシングルトンの機能を提供します。
最後までご覧いただきありがとうございました