【Unity】【Zenject】DIの影響範囲を指定するContextの使い方まとめ

ZenjectでDIの影響範囲を指定するContextの使い方まとめです。

Unity2018.2
Zenject7.3.1

Project Context

Project Contextはプロジェクト全体に影響を及ぼすContextです。
つまりこれにセットしたInstallerはすべてのシーンのフィールドに対してDIを行います。

使い方としては次の通りです。

  1. Projectビューで右クリック > Create > Zenject > Project Context
  2. 1.をResourcesフォルダに入れる
  3. InspectorからInstallerを設定する
  4. Scene Contextが設定されているSceneに置いて再生する

Project ContextはScene Contextの親となるためScene Contextが必要ですが、
Resourcesフォルダに入れておけば再生時に自動的に生成してくれます。

SceneContext

Scene ContextはそのSceneにあるものを対象としてDIします。
使い方は次の通りです。

  1. Hierarchyで右クリック > Zenject > Scene Context
  2. InspectorからInstallerを設定する

またScene ContextにはScene Context同士の親子関係を設定するContractという仕組みがあるのですが、
これはScene Parentingの節で説明します。

Game Object Context

Game Object Contextの影響範囲は、これをアタッチしたGame Objectとその子供たちのみです。
使い方は次の通りです。

  1. Hierarchyで右クリック > Zenject > Game Object Context
  2. InspectorからInstallerを設定する

また、Game Object Context同士を入れ子にしてもやはり影響範囲はそれぞれのGameObjectとその子供たちのみです。
影響範囲を図示すると以下のようになります。

f:id:halya_11:20190102224023p:plain

Scene Parenting

いま、Scene ContextとDIのターゲットがそれぞれ一つずつ置かれている二つのSceneを同時に読み込むとします。

f:id:halya_11:20190102224909p:plain

このとき、Contextの影響範囲は当然ですがそれぞれのSceneのみになります。

f:id:halya_11:20190102225001p:plain

ただ、マルチシーンでZenjectを使っていると「あるScene Contextの影響範囲に他のSceneを加えたい」ということがあります。

f:id:halya_11:20190102225131p:plain

そんな時にはScene ContextのContractを使います。
まず、Scene1のScene ContextのContract NameにMainと入力します(名前はなんでもいいですが)。

f:id:halya_11:20190102225238p:plain

次にScene2のScene ContextのParent Contract Nameに先ほどと同じくMainと入力します。

f:id:halya_11:20190102225404p:plain

そして、Scene1を読み込んでからScene2を読み込みます。
これでScene Context同士の親子関係が構築され、Scene1のScene ContextがScene2にも影響するようになりました。

f:id:halya_11:20190102225452p:plain

Scene Decorator Context

最後にScene Decorator Contextを紹介します。
Scene Decorator Contextは別SceneのScene ContextにInstallerを追加する働きをします。
元のScene Contextに変更を加えずにInstallerを追加できるため、デバッグ用のDIを行うときに使うようです。

f:id:halya_11:20190102230353p:plain

使い方としては、まず元のScene1のScene ContextのContract NameにMainと入力します。

f:id:halya_11:20190102230539p:plain

次に別のScene2として作成し、Hierarchyで右クリック > Zenject > Decorator Contextを選択します。
そしてInspectorからDecorated Contextに先ほどのMainを入力し、適当なInstallerを設定します。

f:id:halya_11:20190102230928p:plain

そして、Scene2を読み込んでからScene1を読み込みます。
これで元のScene ContextにInstallerが追加されたような振る舞いになりました。

参考

github.com

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com