Unity+UnrealEngine4+Blog.

UnityやUnrealEngine4とかについて学習したことを書いてます

Unity シングルトンを使ってマネージャークラス作成とそのアクセス

ヘルプで人のプロジェクトを触った時に、その中のシングルトンを使ったマネージャークラスが安心、使いやすくて便利だったので復習兼ねて書きます。

 

シングルトンとは↓

ja.wikipedia.org


シングルトンとは、そのクラスのインスタンスがひとつしか生成されないことを保証するデザインパターンのことです。その分野のすべてを司るManagerクラスでよく使われるそうです。(EventManagerなど)

 

有名なデザインパターンなので見たり調べたりしたことはあるんですが、コンテンツ作る時は基本的に最初から最後まで1人での作成なのと(混乱しない)、2~3ヵ月の小規模プロジェクトが主なので、メリットがあまりわからず自分で実装したことはありませんでした。

 

ただ、使ってていいなと思ったので次回のプロジェクトからはちゃんとしようと思い、まとめました。

 

SomethingManagerを作成してシングルトンにしてみました。↓

f:id:nabesi777:20200623170820p:plain

 

このスクリプトをオブジェクトへアタッチしてエディター再生すると、Consoleにランダムな数値が出力されます。 *また、namespaceを追加しているのは、このクラスのメソッドを使うのに便利なので追加しています。

 

例えば2つのゲームオブジェクトを作成して、それぞれにこのスクリプトをアタッチしてみます。通常ならゲームオブジェクトが2つあるので2つのランダムな数値が出力されますが、シングルトンにしているため出力がひとつになります。

f:id:nabesi777:20200623171238p:plain

 

 出力結果↓

f:id:nabesi777:20200623171528p:plain

 

ちなみにDestoryをコメントアウトすると、2つの結果が出力されます。

f:id:nabesi777:20200623171611p:plain

結果

f:id:nabesi777:20200623171718p:plain

 

シングルトンが機能していることを確認することができました。

 

ただ、ひとつしか生成するつもりのないManagerクラスが2つできるのは基本的におかしいので、Destoryというかエラーにして作成段階でそういったバグをつぶすのがいいかなぁと思ってます。

f:id:nabesi777:20200623172015p:plain

f:id:nabesi777:20200623172036p:plain

 

シングルトンの定義は上のようにして、今度は使う方です。

Aキーを押すと、SomethingManagerで定義したSayHelloメソッドを呼ぶようにしています。また上で追加したnamespaceをusingへ加えています。

f:id:nabesi777:20200623172629p:plain

 

ゲームオブジェクトへアタッチして実行しました↓

f:id:nabesi777:20200623173119p:plain

f:id:nabesi777:20200623173141p:plain

 

namespaceを使ってるので、呼ぶのが楽ですね! 

 

ちなみに上はひとつのシーンで呼んでますが、別シーンからも簡単に呼ぶことができます。

f:id:nabesi777:20200623173250p:plain

f:id:nabesi777:20200623173307p:plain

 

蛇足ですが他シーンから呼ぶときには、SomethingManagerが生きている必要があるので、DontDestroyOnLoad(gameObject);とするか、

f:id:nabesi777:20200623173635p:plain


またはManagerクラスの置いてあるシーンはゲーム中ずっと生かしておくよう

下のようにシーンを追加したり、アンロードしてシーンコントロールする必要があります。この方法はなにかと便利なのでよく使います。

f:id:nabesi777:20200623174344p:plain

f:id:nabesi777:20200623173901p:plain

 

あとManagerクラスを作成するときは、それを司るジャンルについて(例えばAudioManagerなら音に関して)のプログラムを呼び出す時にはすべてManagerクラスを経由するように設計してつくるのが良さそうです。

*思いつかないのですごい適当ですが、概念だけ↓

use -- AudioManager.cs -- AudioPlayer.cs

                                         | --AudioVolumeControl.cs