はじめに
Unityでゲームを作っていると、GameManagerやAudioManagerのように、
「どこからでもアクセスしたいけど、インスタンスは1つだけにしたい」
というクラスがよく登場します。
そのときによく使われるのがシングルトンです。
シングルトンとは?
Singletonとは、
「クラスのインスタンスが常に1つだけ存在し、
どこからでも同じインスタンスにアクセスできる」
という設計パターンです。
Unityではよく、次のような形で参照されます。
GameManager.Instance
このInstanceを通して、どのスクリプトからでも同じGameManagerにアクセスすることができます。
なんで必要?
例えば、次のような処理を考えてみます。
・スコア管理
・ゲームの進行状態管理
・BGM・SEの再生管理
これらは、
・プレイヤー、敵、UIを複数管理する
・シーンが変わってもやりたいことは共通
といった特徴があります。
毎回FindObjectOfTypeを使ったり、すべてのスクリプトに参照を渡したりするのは大変です。
どこからでも、同じものにアクセスしたい。
このような場合、シングルトンが必要とされます。
基本的な実装
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
}
}
通常、上のような書き方がよくなされます。
最初の部分に注目です。
public static GameManager Instance;
staticとは、クラスに紐づく変数のことをいいます。
つまり、「今存在している唯一のGameManager」 を指しています。
DontDestroyOnLoad
シーンをまたいでもシングルトンを保持したい場合、次の1行を追加することが多いです。
DontDestroyOnLoad(gameObject);
これで、シーン遷移しても破棄されず、常に同じGameManagerを使えるようになります。
おわり
シングルトンは、Unityでゲームを作るうえで非常に大切な要素です。
これをマスターすることは、しっかりとしたゲームへと繋がります。