【Unity】汎用性のあるシングルトンパターン

Unityでシングルトンを使う手順を示します

MonoBehaviourを継承している場合(シーン上のゲームオブジェクトにアタッチするスクリプト)

  1. Unityプロジェクトを開き、シングルトンを実装するスクリプトを作成します。新しいC#スクリプトを作成し、名前を設定します(例: SingletonManager)。
  2. SingletonManager スクリプトの中身を以下のように変更します。
using UnityEngine;

public class SingletonManager : MonoBehaviour
{
    private static SingletonManager instance;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // シーン切り替え時にオブジェクトを維持
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // 他のコンポーネントからこのシングルトンを参照できるプロパティ
    public static SingletonManager Instance
    {
        get { return instance; }
    }

    public void DoSomething()
    {
        Debug.Log("SingletonManagerで何かを実行します。");
    }
}

このスクリプトはシングルトンマネージャを作成し、シーン間でオブジェクトを維持するためにDontDestroyOnLoadを使用します。

  1. Unityエディタで、ゲームオブジェクトを作成し、SingletonManager スクリプトをアタッチします。このゲームオブジェクトはシングルトンとしての役割を果たします。
  2. シーン内の他のオブジェクトから、シングルトンマネージャのインスタンスにアクセスできます。例えば、以下のように他のスクリプトから呼び出すことができます
SingletonManager.Instance.DoSomething();

これにより、Unityプロジェクトでシングルトンパターンを使用する準備が整います。シングルトンマネージャを使って、ゲーム内のさまざまな場所から共有のデータや機能にアクセスできます

MonoBehaviourクラスの場合

プロジェクトビューにスクリプトファイルが存在するだけで、インスペクターでアタッチされない場合です

MonoBehaviourを継承していないクラスをシングルトンとして実装する場合、シングルトンマネージャを作成し、MonoBehaviourを継承しているゲームオブジェクトにアタッチすることはできません。代わりに、シングルトンパターンの実装が変わります。

以下に、MonoBehaviourを継承していないクラスでのシングルトン実装のサンプルコードを示します。

public class MySingleton
{
    private static MySingleton instance;

    private MySingleton()
    {
        // コンストラクタをprivateにして外部からのインスタンス化を防ぎます
    }

    public static MySingleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new MySingleton();
            }
            return instance;
        }
    }

    public void DoSomething()
    {
        // 何かの操作を実行します
    }
}

このクラスはMonoBehaviourを継承していないため、ゲームオブジェクトにアタッチすることはできません。代わりに、このクラスの唯一のインスタンスにアクセスするためにInstance プロパティを使用します。

このようにして、MonoBehaviourクラスとしてのシングルトンを実装し、必要なときにアクセスできるようになります。他のクラスからは、MySingleton.Instance を使用してこのシングルトンのインスタンスにアクセスできます。

使い方

前の例で作成したMySingletonクラスを使用して、シングルトンのインスタンスを取得し、そのインスタンスにアクセスする方法を以下に示します。

MySingleton クラスのインスタンスを取得します。

MySingleton singleton = MySingleton.Instance;

このコードにより、MySingleton クラスの唯一のインスタンスが取得されます

シングルトンのインスタンスを使用して、メソッドやプロパティにアクセスします

singleton.DoSomething(); // シングルトンのメソッドを呼び出す

これにより、MySingleton クラスの唯一のインスタンスが持つメソッド DoSomething() が呼び出されます

全体コード

using UnityEngine;

public class SingletonDemo : MonoBehaviour
{
    private void Start()
    {
        // MySingletonクラスの唯一のインスタンスを取得
        MySingleton singleton = MySingleton.Instance;

        // シングルトンのメソッドを呼び出す
        singleton.DoSomething();
    }
}

このようにして、MonoBehaviourクラスとして実装されたシングルトンを使用できます。このシングルトンパターンを使うことで、アプリケーション内の異なる部分から唯一のインスタンスにアクセスでき、共有のデータや機能を効果的に管理できます