SingletonMonoBehaviour<T>

abstract

名前空間:SilCilSystem.Singletons

継承:UnityEngine.MonoBehaviour


ゲーム内に1つしか存在しないコンポーネントの作成に使用する抽象クラスです。

メンバ一覧

メソッド

member description
protected void OnAwake() Awakeで呼ばれます。基底クラスのAwakeをvirtualにするとbase.Awakeの呼び出し忘れが起こるのでこういう形にしています。
protected void OnDestroyCallback() OnDestroyで呼ばれます。

使用例

シングルトンを作成する場合はこのクラスを継承したコンポーネントを作成します。 例えば、文字列をDebug.Logで表示するためのシングルトンは以下のようになります。

using UnityEngine;
using SilCilSystem.Singletons;

public class SingletonExample : SingletonMonoBehaviour<SigletonExample>
{
    protected override void OnAwake()
    {
        // Awake時に呼ばれます。
    }

    protected override void OnDestroyCallback()
    {
        // OnDestroy時に呼ばれます。
    }

    public void Write(string text)
    {
        Debug.Log(text);
    }
}

呼び出しはInstanceにアクセスします。

using UnityEngine;

public class SingletonExampleUser : MonoBehaviour
{
    private void Start()
    {
        SingletonExample.Instance.Write("Test");
    }
}

使用上の注意点

作成したシングルトンは自動で生成されるわけではありません。 スクリプトをアタッチしたGameObjectをシーン上に配置しましょう。

実装

Awake内で重複がないかをチェックしています。 すでに別のGameObjectが存在する場合には削除し、存在しない場合はDontDestoryOnLoadを用いてGameObjectが破棄されないように設定します。

private void Awake()
{
    if(Instance == null)
    {
        Instance = this as T;
        DontDestroyOnLoad(this.gameObject);
        OnAwake();
    }
    else
    {
        Destroy(gameObject);
    }
}

明示的にGameObjectを削除した場合にはInstanceにはnullが代入されます。 これはOnDestroyで処理しています。

private void OnDestroy()
{
    Instance = (Instance == this) ? null : Instance;
    OnDestroyCallback();
}

トップへ