SingletonMonobehaviour再び

以前作ったSingletonMonobehaviourはシーン遷移時に破棄されるものでした。

以前のもの↓
waken.hatenablog.com


シーンをまたいだ時に破棄されないようなものも欲しくなったので、Awake内でDontDestoryにしています。その他もちょこちょこ変えています。

Awakeを上書きされるとPersistentじゃなくなっちゃうんですが、doAwakeという関数をabstractにしており、絶対実装しないと駄目なようにしているので自制しやすいんじゃないかと思います。

public abstract class PersistentSingletonMonoBehaviour<T> : MonoBehaviour where T : PersistentSingletonMonoBehaviour<T>
{
	private static T instance;
	public static T Instance {
		get {
            if ( instance == null ) {
                instance = ( T )FindObjectOfType( typeof( T ) );
                if ( instance == null ) {
                    Debug.LogError ( typeof( T ) + " does not exist" );
                }
            }
			return instance;
		}
	}

    //@memo
    //継承先でAwakeを定義しちゃ駄目
    //代わりにdoAwakeを作る。
	private void Awake()
	{
		if( this != Instance )
		{
			Destroy( this.gameObject );
			Debug.Log( typeof( T ) + " has already attached to \"" + Instance.gameObject.name + "\"" );
			return;
		}

		DontDestroyOnLoad( this.gameObject );

		doAwake();
	}

	protected abstract void doAwake();
}