Zenject で、Installer を使って DI してみました。
(※ Zenject ビギナーなので、誤り等あればご指摘お願いいたします!)
Zenject_250x250
これまでは Installer の書き方がよく分からなくて、すべて ZenjectBinding コンポーネントに頼っていました。(過去記事はタグ Zenject からどうぞ)


以下の LIGHT11 様の記事を読んで、Installer について少し分かった気になったので試してみました。神。今回の記事は、こちらの LIGHT11 様の記事とあわせて読んでくださいね。

すごく大切なことが分かりやすくまとめられている気がします。熟読すべし。

たとえば、MonoBehaviour と非 MonoBehaviour で、注入するためのメソッドが異なることなど。

今回の記事は、MonoBehaviour を注入する例です。


ZenjectBinding を使う場合(自分にとっての基本形)

まずは ZenjectBinding を使う場合。これが自分にとっての基本形です。最初に覚えたので。
こんな感じに、インスペクターでセットするだけ。簡単ですね。
zenjectBinding
PronamaInput コンポーネントは、PC上でプレイヤーキャラクターを操作するためのスクリプトです。

ZenjectBinding を使う方法は、こちらの記事でもうちょっと詳しく紹介しています。


Installer を使ってみる

ではさっそく Installer を使っていきましょう。
上図の PronamaInput コンポーネントを、ZenjectBinding でバインドせずに、Installer でバインドしてみます。

Installer はこんな感じ。
(Project ビューで右クリック > Create > Zenject > MonoInstaller で、MonoInstaller のひな型が作られるので、それを編集します)

(7行目) [SerializeField] で、バインドするコンポーネントがアタッチされているゲームオブジェクトを指定してします。

(13行目) FromComponentOn メソッドは引数の GameObject に予めアタッチされたコンポーネントを使う、ということのようです。(詳しくは上の LIGHT11 様の記事を参照してください)

作った Installer スクリプトを SceneContext の MonoInstallers 欄にセットしておきます。
スクリーンショット (975).png

PronamaInput コンポーネントは Installer でバインドすることにしたので、ZenjectBinding のリストからは抜きました。
スクリーンショット (974).png

これでOK。ZenjectBinding を使わずにバインドできるようになりました。


Installer でコンポーネントを新規アタッチするよう書き換えてみる

次に、このように書き換えてみます。

(7行目) コンポーネントをアタッチする先のゲームオブジェクトを指定しています。

(13行目) さきほど FromComponentOn メソッドを使っていた箇所を、FromNewComponentOn メソッドに置き換えています。それだけ。

FromNewComponentOn メソッドは、コンポーネントを(引数で指定したGameObjectに)新規でアタッチしてくれるようです。

というわけで、あらかじめ GameObject にコンポーネントをアタッチしておく必要がなくなりました。(下図に PronamaInput コンポーネントがないことを確認してください)
スクリーンショット (976).png

SceneContext の設定はさきほどと変わらず。

これだけ。なんだか、少し自由になった気がしますね。


Installer でプレハブを新規追加するように書き換えてみる

さて、次は Installer でプレハブをシーンに追加するようにしてみます。
さきほどまでとは別ファイルとして作ります。

こんな感じ。

(10行目) 生成するプレハブを指定しています。

(16行目) FromComponentInNewPrefab メソッドは、引数の Prefab をインスタンス化してアタッチされたコンポーネントを注入する、ということのようです。

今回は、下図のような(スマホ向けビルド用の)操作ボタンとそれを動かすスクリプト(PronamaGUIButtonInput)を含むキャンバス(ButtonCanvas)をプレハブ化して、それを Installer から生成させるようにしています。
スクリーンショット (977).png

SceneContext  の Mono Installers 欄で、新しく作った Installer に差し替えます。
スクリーンショット (978).png
これでOK。

実行すると、シーン上にプレハブ化したキャンバスが生成され、かつその中に含まれるスクリプトもちゃんとバインドされています。

これはいい感じですね。


Installer を切り替える

さて、PC操作用のスクリプトを生成してアタッチする Installer と、スマホ操作用のキャンバス(とその中に含まれるボタン、スクリプト)を生成してアタッチする Installer の2種類が出来上がりました。

この2つを切り替えるには、SceneContext Mono Installers 欄ににセットする Installer を変えるだけ。
スクリーンショット (978).png

PronamaInputInstaller をセットすれば PC 操作用の環境になり、PronamaGUIButtonInputInstaller をセットすればスマホ操作用の環境になります。ワンタッチ。

ここまでくると、ZenjectBinding ではなく Installer を使う威力が実感できますね。


今回は以上です。