Extenject を使っていて、 すでに読み込み済みのシーン内のコンポーネントを、追加で読み込むシーンにDIしたい場合
Scene Parenting という機能があります。
GitHub - Mathijs-Bakker/Extenject: Dependency Injection Framework for Unity3D
サンプルシーン構成
例として GameSystem と Environments シーンの二つを作成し、
GameSystem シーンの Main Camera を Environments シーンにDIしてみます。
親シーン
GameSystemシーンを親とします。
Extenject の SceneContext を追加し、以下のように設定します。
- まず通常の手順通り Mono Installer スクリプトを作成し、Scene Context の Mono Installers に設定します。
- 次に Contract Names に適当な文字列を入力。あとで Environments シーンから参照するために必要です。
Game System Installer の中身は以下のとおり。
using UnityEngine; using Zenject; public class GameSystemInstaller : MonoInstaller { public override void InstallBindings() { Container.Bind<Camera>().FromComponentInHierarchy().AsSingle(); ; } }
Camera をDIしています。
子シーン
子となる Environments シーンでは、Mono Installer は作成しなくていいです。
そのかわり、SceneContext の Parent Contract Names に親シーンで設定した参照用の文字列を設定します。
MonoBehaviour でInject する
これでMonoBehaviourスクリプトを以下のように記述すれば、GameSystem、Environments 両方のシーンで
Main Camera をDIしてくれます。
public class EnvironmentsTest : MonoBehaviour { [Inject] Camera MainCamera; ... }
シーンをロードする
Unity上で マルチシーン編集している場合 プレイモードに入ると自動でDIしてくれます。
一つずつシーンを読み込む場合、まず親である GameSystem シーンを読み込み
以下のように Environments シーンを追加で読み込みます。
SceneManager.LoadSceneAsync("Environments", LoadSceneMode.Additive);
ただし子シーンにあるオブジェクトを親シーンにDIはできないので、別な方法を考えましょう。
GitHub - starikcetin/Extenject: Dependency Injection Framework for Unity3D