ヘルプで人のプロジェクトを触った時に、その中のシングルトンを使ったマネージャークラスが安心、使いやすくて便利だったので復習兼ねて書きます。
シングルトンとは↓
シングルトンとは、そのクラスのインスタンスがひとつしか生成されないことを保証するデザインパターンのことです。その分野のすべてを司るManagerクラスでよく使われるそうです。(EventManagerなど)
有名なデザインパターンなので見たり調べたりしたことはあるんですが、コンテンツ作る時は基本的に最初から最後まで1人での作成なのと(混乱しない)、2~3ヵ月の小規模プロジェクトが主なので、メリットがあまりわからず自分で実装したことはありませんでした。
ただ、使ってていいなと思ったので次回のプロジェクトからはちゃんとしようと思い、まとめました。
SomethingManagerを作成してシングルトンにしてみました。↓
このスクリプトをオブジェクトへアタッチしてエディター再生すると、Consoleにランダムな数値が出力されます。 *また、namespaceを追加しているのは、このクラスのメソッドを使うのに便利なので追加しています。
例えば2つのゲームオブジェクトを作成して、それぞれにこのスクリプトをアタッチしてみます。通常ならゲームオブジェクトが2つあるので2つのランダムな数値が出力されますが、シングルトンにしているため出力がひとつになります。
出力結果↓
ちなみにDestoryをコメントアウトすると、2つの結果が出力されます。
結果
シングルトンが機能していることを確認することができました。
ただ、ひとつしか生成するつもりのないManagerクラスが2つできるのは基本的におかしいので、Destoryというかエラーにして作成段階でそういったバグをつぶすのがいいかなぁと思ってます。
シングルトンの定義は上のようにして、今度は使う方です。
Aキーを押すと、SomethingManagerで定義したSayHelloメソッドを呼ぶようにしています。また上で追加したnamespaceをusingへ加えています。
ゲームオブジェクトへアタッチして実行しました↓
namespaceを使ってるので、呼ぶのが楽ですね!
ちなみに上はひとつのシーンで呼んでますが、別シーンからも簡単に呼ぶことができます。
蛇足ですが他シーンから呼ぶときには、SomethingManagerが生きている必要があるので、DontDestroyOnLoad(gameObject);とするか、
またはManagerクラスの置いてあるシーンはゲーム中ずっと生かしておくよう
下のようにシーンを追加したり、アンロードしてシーンコントロールする必要があります。この方法はなにかと便利なのでよく使います。
あとManagerクラスを作成するときは、それを司るジャンルについて(例えばAudioManagerなら音に関して)のプログラムを呼び出す時にはすべてManagerクラスを経由するように設計してつくるのが良さそうです。
*思いつかないのですごい適当ですが、概念だけ↓
use -- AudioManager.cs -- AudioPlayer.cs
| --AudioVolumeControl.cs