はじめに
ゲームマネジャーなど1つしか存在しないことが保証されているオブジェクトをシングルトンで利用したい場面があると思います。というわけで、継承すればシングルトンになるクラスを用意しましょう。
コード
1 2 3 4 5 6 7 8 9 10 11 12 |
using UnityEngine; public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour { private static T _instance; public static T Instance { get { return _instance ?? (_instance = FindObjectOfType<T>() as T); } } } |
上記を継承したスクリプトをシーン上のゲームオブジェクトとしてアタッチすればシングルトンとして機能します。
注意点
上記のスクリプトは便利ですが、シーンのリロードなどを行うとオブジェクトは破棄される一方でクラス変数の参照先が保持されるため、 The object of type XXX has been destroyed but you are still trying to access it.
というエラーが出ます。その場合は、OnDestroyでゲームオブジェクト破棄時にクラス変数をnullにすれば解決します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour { /*...*/ protected void OnDestroy() { if( _instance == this ) { _instance = null; } } } |