シングルトンとは
シングルトン(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が突然消えたときに、エラー祭りとなってしまいます。
クラス同士の依存関係的に、直接アクセスするクラスと、しないクラスでしっかり管理する必要があります。
とはいっても、小規模のゲームを作る程度なら気にせず、まずは使ってみるのがいいと思います!

 
  
  
  
   
					 
					 
					
