シングルトン とは、数多くある
デザインパターン の1つです。
そのクラスのインスタンスが必ず1つであることを保証する デザインパターンのことを言います。
EffectManager クラスでは、このシングルトンを採用しています。
つまり、ゲーム中を通じて、この
EffectManager クラスが1つしか存在できないようになります。
実装例は複数ありますが、一番読みやすい方式で記述しています。
<シングルトンデザインパターンのクラスの作成方法>
public static EffectManager instance; // クラス名と同名の型を static で宣言する
private void Awake() {
if (instance == null) {
instance = this;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject);
}
}
ポイントは、
自分自身の EffectManager 型を static 修飾子付きの instance 変数として宣言していることです。
この
instance 変数が EffectManager クラス自身が代入された情報として利用することになります。
Awake メソッドを利用して、instance 変数が null (空っぽ) である場合には、EffectManager クラス(this)を代入します。
次の DontDestroyOnLoad メソッドは Unity が用意しているメソッドで、引数に指定されたゲームオブジェクトは
シーン遷移をしても破壊されてないゲームオブジェクトになります。
この DontDestroyOnLoad メソッドはシングルトンデザインパターンにする際に
一緒に用いられることが多いです。
そして instance 変数が null ではない場合、つまり、2つ目以降の複数の EffectManager クラスが存在する場合には、その EffectManager クラスのゲームオブジェクトを Destroy します。
この手順により、
EffectManager クラスがアタッチされているゲームオブジェクトが常にヒエラルキー上に1つしか存在しない状態を作り出しています。
このシングルトンによって
インスタンスが1つか生成されないことが保証されますので、
逆説的に考えると、この
EffectManager クラスへの参照は、いずれのクラスからであっても変数を介さずに参照を行えるようになります。
例えば、NonPlayerCharacter というクラスがあり、その NonPlayerCharacter クラスを持つゲームオブジェクトが5つあった場合、
「
どの」NonPlayerCharacter クラスであるかを確定できないと、対象となる NonPlayerCharacter クラスへは参照できません。
そのため、NonPlayerCharacter 型の変数を用意して、その変数へ参照したい NonPlayerCharacter クラスを代入することによって、
はじめて NonPlayerCharacter クラスの情報を扱うことができるようになります。これが情報を扱う際の基本的な処理になります。
ですがシングルトンである EffectManager クラスの場合には、このインスタンスは常に1つしかないことが保証されていますので、
「
どの」という指定の部分が
不要になります。よってクラスの特定ができているため、
変数への代入が不要になります。
EffectManager という指定はすなわち、自動的にただ1つの EffectManager クラスの参照が行われることになるためです。
この機能を利用して EffectManager クラスを作成しておくことで、どのクラスからでも参照しやすい設計にしておきます。
以上でこの手順は終了です。
=> 次は
手順6 ープレイヤーの攻撃機能の実装ー です。