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回



ディスカッション
コメント一覧
まだ、コメントがありません