0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Unity】Singletonパターンでクラスを実装しよう

Last updated at Posted at 2024-07-14

Singletonパターンとは

Singletonパターンとは、ソフトウェアデザインパターンの1つで、
特定のクラスのインスタンスがプログラム全体で一意に存在することを保証する方法です。

具体的には、次の3つの性質を持っています。

1.唯一のインスタンス

シングルトンクラスのインスタンスは1つしか存在しません。
新たに外部からインスタンスを生成することはありません。

2.グローバルなアクセスポイント

シングルトンクラスのインスタンスには、
どこからでもアクセスできる共通のアクセスポイントが提供されます。

3.インスタンス化の制御

シングルトンパターンでは、通常、最初のアクセス時にインスタンスが生成されます。
そして、その後のアクセスではその生成されたインスタンスが再利用されます。

Singletonパターンでクラスを実装する

上記3つの特性に沿って実装したクラスがこちらです。
using UnityEngine;

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

    // インスタンスのプロパティ
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                // シーン内からインスタンスを検索
                instance = FindObjectOfType<Singleton>();

                if (instance == null)
                {
                    // インスタンスが見つからなかった場合、新しいゲームオブジェクトを作成
                    GameObject singletonObject = new GameObject();
                    instance = singletonObject.AddComponent<Singleton>();
                    singletonObject.name = typeof(Singleton).ToString() + " (Singleton)";

                    // シーン遷移時にオブジェクトを破棄しないように設定
                    DontDestroyOnLoad(singletonObject);
                }
            }
            return instance;
        }
    }

    // Awakeメソッドで重複インスタンスをチェック
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
    }
}

1.唯一のインスタンスに該当するのは

// シングルトンインスタンス
private static Singleton instance;

2.グローバルなアクセスポイントに該当するのは

// インスタンスのプロパティ
public static Singleton Instance
{
    get
    {
        if(instance == null)
        {
            // 最初のアクセス時にインスタンスを生成
            instance = new Singleton();

            // シーン遷移時に破棄されないようにする
            DontDestroyOnLoad(instance.gameObject);
        }
        return instance;
    }
}

3.インスタンス化の制御に該当するのは

// Awakeメソッドで重複インスタンスをチェック
private void Awake()
{
    if (instance == null)
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else if (instance != this)
    {
        Destroy(gameObject);
    }
}

という構成になっています。
Singletonパターンで実装するだけなら、DontDestroyOnLoadに設定する必要はありません。

最後までご覧いただきありがとうございました :laughing:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?