Unityでのシングルトン入門

広告

シングルトンは、ゲーム全体で1つだけ存在してほしい管理クラスを作るための考え方です。

例えば、次のようなものに使われます。

  • ゲーム全体の管理
  • スコア管理
  • サウンド管理
  • セーブデータ管理

まずは完成形

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    public int Score { get; private set; }

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }

        Instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void AddScore(int point)
    {
        Score += point;
        Debug.Log("現在のスコア:" + Score);
    }
}

使い方

別のスクリプトから、次のように呼び出します。

using UnityEngine;

public class Coin : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        GameManager.Instance.AddScore(10);

        Destroy(gameObject);
    }
}

何が便利なのか

普通なら、GameManager を探してから使う必要があります。

GameManager gameManager = FindObjectOfType<GameManager>();
gameManager.AddScore(10);

しかしシングルトンにすると、どこからでも次の形で使えます。

GameManager.Instance.AddScore(10);

Awakeの中で何をしているか

if (Instance != null && Instance != this)
{
    Destroy(gameObject);
    return;
}

すでに GameManager が存在している場合は、あとから作られたものを削除します。

Instance = this;

自分自身を Instance に登録します。

DontDestroyOnLoad(gameObject);

シーンを切り替えても削除されないようにします。

Unityでの注意点

シングルトンは便利ですが、使いすぎると依存関係が見えにくくなります。

例えば、どのクラスも次のように書けてしまいます。

GameManager.Instance.AddScore(10);
SoundManager.Instance.PlaySE();
SaveManager.Instance.Save();

便利な反面、あとから修正しづらくなることがあります。

使ってよい場面

次のような「ゲーム全体で1つだけ」のものには向いています。

GameManager
SoundManager
SaveManager
SceneLoader

あまり向いていない場面

敵、アイテム、弾、プレイヤーの一時的な状態などには向いていません。

Enemy
Bullet
Item
DamageText

これらは複数存在することが多いからです。

まとめ

シングルトンは、Unityで1つだけ存在する管理役を作るときに便利です。

ただし、何でもシングルトンにするのではなく、

「これはゲーム全体で1つだけ必要か?」

を考えて使うのが大切です。

訪問数 7 回, 今日の訪問数 7回

広告