Zenject というアセットを使い始めてみました。その一歩目。
Zenject_250x250

Zenject 

Zenject はこちら。無料のアセットです。



GitHub でも公開されていますね。さまざまな使い方も紹介されているようです。


DI(Dependency Injection)とは?

Zenject は、Dependency Injection Framework for Unity3D ということのようです。

Dependency Injection って何?
って思いますよね。
こちらで、猿でも分かるように解説されています。

まあ、自分は「猿でも分かる」ように解説された記事を読んで、しっかり理解できたかと言われると微妙ですが。。。とにかく Dependency Injection(DI)のキモは、「依存する部分を、(使う側が名指しで指定するのではなく)外からいい感じに注入してもらう」という感じのようです。という感じな感じです。

Zenject は、Unity で DI を実現しやすくるためのスクリプト群のようです。


"禅"を理解するのは難しい

しかししかししかし。この Zenject 、難しいです。
公式のドキュメントを読み解くのも大変(英語だし)。過去にも手を出そうとしましたが、まったく理解不能でした。


いちばん簡単な使い方(SceneContext と ZenjectBinding)

とにかく、いちばん簡単と思われる使い方をおぼえたので、紹介します。

1. シーンに SceneContext を置く

シーン上の任意のオブジェクトに、Zenject の SceneContext コンポーネントをアタッチします。
今回はシーン上に空の SceneContext オブジェクトを作って、そこに SceneContext コンポーネントを置きました。特に設定不要です。
スクリーンショット (931).png

2. ZenjectBinding コンポーネントを置き、バインドするコンポーネントをセットする

次に、これもシーン上の任意のオブジェクトに、ZenjectBinding コンポーネントをアタッチします。

今回は GameManager オブジェクトにアタッチしています。
スクリーンショット (933).png
ZenjectBinding コンポーネントの Components 欄に、他のクラスから呼び出したい(= 他のクラスで注入したい)コンポーネントをセットします。

今回は ScoreManger をセットしました。中身はこんな感じ。IPickup インターフェースを実装しています。


ZenjectBinding の Components 欄には複数のコンポーネントをセットすることもできます。また、今回は ZenjectBinding と同じオブジェクト内にあるコンポーネントをセットしていますが、異なるオブジェクトのコンポーネントもセットできます。

Bind Type ですが、Components にセットしたコンポーネントそのものを注入する場合は Self(規定値)、Interface として注入する場合には All Interfaces を指定すればよさそうです。(両方の場合は All Interfaces And Self

なお ZenjectBinding コンポーネントは、シーン上に複数あってもOKなようです。


4. スクリプトから、Bind されたコンポーネントを Inject する

こちらのコードのようにして、ZenjectBinding にセットしたコンポーネントを Inject(注入)します。


この例ではインターフェースを指定して Inject しています。
[Inject] ScoreManager scoreManager; のようにして、インターフェースを介さずに Inject することも可能です。

これで設定は終わりです。
実行してみると、[Inject] 指定した変数に、ZenjectBinding でセットしたコンポーネントが Inject されて正しく動作します。


参考資料

参考資料はこちら。
ほかにもネット上にたくさん情報があるので、あれこれ読みながら試しています。


今の自分の力量的には Zenject の全体を理解するのは無理そうなので、簡単に使えそうな範囲だけつまみ食いできたらいいのかなと思っています。(あと2つほど記事を公開予定)


今回は以上です。