Unity_Lesson

シングルトンパターン

定義

シングルトンパターンは、特定のクラスのインスタンスが一つしか存在しないことを保証するデザインパターンです。
このインスタンスにはグローバルなアクセスポイントが提供され、必要に応じてこのインスタンスを共有します。


目的

グローバルなアクセス点を提供し、インスタンスの数を制限する。

特定のクラスのインスタンスがプログラム全体で唯一であり、その唯一性を保証することで、リソース消費を最適化し、一貫性を保つ。


Unityでの実際の使用例


利点


注意点


シングルトンパターンの実装例

下記2つのスクリプトのうち、GameManager.csを適当なGameObjectにアタッチして再生


SettingsManager.cs

using UnityEngine;

public class SettingsManager {
    // シングルトンインスタンス
    private static SettingsManager instance;

    // 設定データ
    private int soundVolume = 50;
    private bool isFullScreen = true;

    // コンストラクターをprivateにすることで外部からのインスタンス化を防止する
    private SettingsManager() { }

    // インスタンスの取得メソッド
    public static SettingsManager Instance {
        get {
            if (instance == null) {
                instance = new SettingsManager();
                //DontDestroyOnLoad(gameObject);
            }else{
                return instance;
            }
            
        }
    }

    // 設定の取得と設定
    public int SoundVolume {
        get { return soundVolume; }
        set { soundVolume = Mathf.Clamp(value, 0, 100); }
    }

    public bool IsFullScreen {
        get { return isFullScreen; }
        set { isFullScreen = value; }
    }

    // その他の設定管理メソッド
    public void SaveSettings() {
        // 設定の永続化など
        Debug.Log("Settings saved.");
    }

    public void LoadSettings() {
        // 設定の読み込みなど
        Debug.Log("Settings loaded.");
    }
}


GameManager.cs

using UnityEngine;

public class GameManager : MonoBehaviour {
    void Start() {
        // 設定マネージャーのインスタンスを取得
        SettingsManager settingsManager = SettingsManager.Instance;

        // 設定の利用
        Debug.Log("Current Sound Volume: " + settingsManager.SoundVolume);
        settingsManager.SoundVolume = 80;
        Debug.Log("New Sound Volume: " + settingsManager.SoundVolume);

        Debug.Log("Is FullScreen? " + settingsManager.IsFullScreen);
        settingsManager.IsFullScreen = false;
        Debug.Log("Set FullScreen to: " + settingsManager.IsFullScreen);

        // 保存と読み込み
        settingsManager.SaveSettings();
        settingsManager.LoadSettings();
    }
}


classDiagram class SettingsManager { -static instance : SettingsManager -soundVolume : int -isFullScreen : bool +Instance : SettingsManager +SoundVolume : int +IsFullScreen : bool +SaveSettings() : void +LoadSettings() : void } class GameManager { +Start() : void } GameManager --> SettingsManager : "Uses Singleton Instance" SettingsManager <-- SettingsManager : "Singleton Instance"

説明

このように、SettingsManager クラスはゲーム全体で一度しか作成されないインスタンスを管理し、それを他のクラス(この場合は GameManager)が利用する仕組みになっています。