-- 注意!! 雰囲気で理解できればOK理論で、曖昧な表現が多いです・・・ --
Unityで遊んでたある日のこと・・・
「う〜ん、このGameManagerオブジェクト、FindとかGetComponentせずに、 もっと簡単にアクセスできないかなぁ・・・」
「ム、ムム!?Singleton ??」
調べてみると、Singletonとは以下のことを指すようです。
「シングルトンとは、オブジェクト指向プログラミングにおけるクラスのデザインパターンの一つで、
実行時にそのクラスのインスタンスが必ず単一になるよう設計すること。」
(引用:https://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3.html)
なるほど、つまりGameManagerのような同一シーンに2個以上存在して欲しくないクラスを、
Singletonによって1個に制限?するような考え方のようです。
「あ、あれ?Singletonがデータに簡単にアクセスする方法じゃないの?」
どうやら
Singleton == データに簡単にアクセスする
ではなく
Singleton == クラスのインスタンスが1つしかないことを保証する
ということらしいです。
プログラミング初心者の自分は最初、Singletonにすること自体が、データに簡単にアクセスできるようになる と勘違いしていました💦
(しっかりとオブジェクト指向の勉強もしていかなくては・・・泣)
さて記事の本題の「データに簡単にアクセスする」のは、単にアクセス修飾子のstaticのようです。
staticは 「メモリ領域を最初に確保する」 == 「ずっとある。」 == 「インスタンス化してから使う必要がない」 ということで、staticなクラスにすることで、そこに簡単にアクセスできるようになります。
ちなみに余談ですが、C#においてstaticのメモリ領域が割り当てられるのは、そのクラスが初めて評価されるタイミングのようです。
参考 : https://bxdxmx.hatenablog.com/entry/20090623/1245766764
では、GameManagerのような簡単にアクセスできつつ、1つしかないことを保証したいオブジェクトがあります。 ということで、static と Singletonを組み合わせることで綺麗に実現できそうじゃないですか??
MonoBehaviorを継承した汎用的なSingletonクラスのコードをご紹介します。 参考 : https://github.com/dilmerv/UnityMultiplayerPlayground/blob/master/Assets/Scripts/Core/Singleton.cs
public class Singleton<T> : MonoBehaviour
where T : Component
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
var objs = FindObjectsOfType(typeof(T)) as T[];
if (objs.Length > 0)
_instance = objs[0];
if (objs.Length > 1)
{
Debug.LogError("There is more than one " + typeof(T).Name + " in the scene.");
}
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = string.Format("_{0}", typeof(T).Name);
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
このSingletonクラスを継承することで、簡単にSigletonを実装できます。 使い方は以下の通りです。
public class GameManager : Singleton<GameManager>
{
・・・
いつもMonoBehaviourで継承しているところをこいつに変えてやりましょう!!
そしてあとはGameManager.Instance.〇〇
のように取得ができます。
なんとなく少しでも理解の手助けに慣れていたら幸いです。
またさらに、複数のシーンでまたぐオブジェクトにしたい時は、DontDestroyOnLoad()
を入れると良いでしょう。
参考 : https://dkrevel.com/makegame-beginner/make-2d-action-game-manager/
またさらに詳しくSingletonなどについて調べたい方は、以下の記事が参考になる気がします。
https://qiita.com/Kosei-Yoshida/items/d7dc37bcde3a52cb5265#static-class-singleton
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More