スポンサーリンク

【Unity】どこからでもアクセスできるシングルトンクラス

c#

シングルトンとは

シングルトン(Singleton)は、指定したクラスのインスタンスが1つしか存在しないことを保証するデザインパターンの1つです。

プログラム上に1つしか存在しないので、GetComponentなどをせず、簡単にアクセスすることが出来ます。

実装

using UnityEngine;
using System;

//シングルトン親クラス(継承元)
public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;

    //外部からアクセスされるためのプロパティ
    public static T Instance
    {
        get
        {
            //インスタンスがなければ
            if (instance == null)
            {
                //クラスの型を取得
                Type type = typeof(T);

                //自分自身をインスタンス化
                instance = (T)FindObjectOfType(type);

                //アタッチされていない時
                if (instance == null)
                {
                    Debug.LogError(type + " をアタッチしているGameObjectが存在しません");
                }
            }

            return instance;
        }
    }

    virtual protected void Awake()
    {
        // 他のゲームオブジェクトにアタッチされているか調べる
        // アタッチされている場合は破棄する。
        CheckInstance();
    }

    protected void CheckInstance()
    {
        //インスタンスが存在していなければ、自分自身をインスタンス化
        if (instance == null) { instance = this as T; return; }

        //自分自身なら何もしない
        else if (Instance == this) { return; }

        //自分自身を破棄する
        Destroy(this);
        return;
    }
}

このコードは、シングルトン化させたいクラスに継承させるクラスとなります。シングルトンを使いたい場合は、このコードをプロジェクトに追加する必要があります。

使い方

SingletonMonoBehaviourをプロジェクトに追加する

先ほど作った、SingletonMonoBehaviourのスクリプトをプロジェクトに追加します。

シングルトン化させたいクラスに継承する

using UnityEngine;

//シングルトンクラスを継承したゲームマネージャークラス
public class GameManager : SingletonMonoBehaviour<GameManager>
{
    public void DispDebugLog()
    {
        Debug.Log("アクセスできた!");
    }
}

次に、シングルトン化させたいクラスに、SingletonMonoBehaviourクラスを継承させます。これで、GameManagerは、どこからでもアクセスできる状態になりました。

アクセスの方法

using UnityEngine;

//プレイヤークラス
public class Player : MonoBehaviour
{
    private void Start()
    {
        GameManager.Instance.DispDebugLog(); //ゲームマネージャーにアクセス
    }
}

アクセスする側は、GetComponentなどをしなくても、Instanceを呼び出すだけで、簡単にアクセスすることが出来ます。

注意点

シングルトンは一見便利なものですが、どこからでも簡単にアクセスできるということは、アクセス数が増えるごとに、依存関係が高まっていきます。つまり、GameManagerが突然消えたときに、エラー祭りとなってしまいます。

クラス同士の依存関係的に、直接アクセスするクラスと、しないクラスでしっかり管理する必要があります。

とはいっても、小規模のゲームを作る程度なら気にせず、まずは使ってみるのがいいと思います!

タイトルとURLをコピーしました