【Unity】【Zenject】Scene上のコンポーネントを簡単にバインドできるZenject Binding

ZenjectでScene上のコンポーネントを簡単にバインドできる機能、Zenject Bindingの説明です。

Unity2018.2
Zenject7.3.1

Zenject Binding?

Zenject BindingとはSceneに置いたGameObjectにアタッチしたコンポーネント
他のコンポーネントのフィールドに簡単に依存性注入するためのものです。

下記の記事で少し触れましたが、改めて解説します。

light11.hatenadiary.com

簡単な使い方

Zenject Bindingの使い方は次の通りです。

  1. 注入したいコンポーネントをアタッチしたGameObjectを作る
  2. 1.にZenject Bindingをアタッチする
  3. 2.のComponentsに1.のコンポーネントを代入する

こんな感じになります。

f:id:halya_11:20190102165331p:plain

後は再生すれば依存性が解決されます。

Bind Type

Zenject BindingにはBind Typeというフィールドがあります。
この設定により挙動が以下のように変わります。

名前 説明
Self 自身の型のフィールドを対象に依存性注入する
All Interfaces 自身のインタフェースの型のフィールドだけを対象に依存性注入する
All Interface And Self 自身あるいは自身のインタフェースの型のフィールドを対象に依存性注入する
Base 自身の基底クラスの型のフィールドだけを対象に依存性注入する

Identifier

依存性を注入する先のフィールドにはInjectアトリビュートを付けますが、
これにはIdという引数を付与できます。

[Inject(Id = "exampleId")]
private Example _example;

Zenject BindingのIdentifierフィールドにこのIdを設定すると、
特定のコンポーネントのみに依存性注入ができます。

Installerを書く場合のWithId()と同じです。

Container
    .Bind<IExample>()
    .To<Example>()
    .WithId("exampleId")

Use Scene ContextとContext

GameObjectContextの配下のGameObjectにZenject Bindingを使うようなケースで
Use Scene Contextにチェックを入れると、影響範囲がScene Contextのそれになります。

またContextに直接Contextを入れることもできますが、ややこしくなるのであまりやらないほうがよさそうな気がします。

参考

github.com

関連

light11.hatenadiary.com