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