以下の内容はhttps://indie-du.com/entry/2021/11/19/081550より取得しました。


Extenject (旧Zenject) : シーンに親子関係を持たせてDIする

Extenject を使っていて、 すでに読み込み済みのシーン内のコンポーネントを、追加で読み込むシーンにDIしたい場合

Scene Parenting という機能があります。

GitHub - Mathijs-Bakker/Extenject: Dependency Injection Framework for Unity3D

サンプルシーン構成

例として GameSystem と Environments シーンの二つを作成し、
GameSystem シーンの Main Camera を Environments シーンにDIしてみます。

f:id:sugar_affordance:20211119073614p:plain

親シーン

GameSystemシーンを親とします。
Extenject の SceneContext を追加し、以下のように設定します。

f:id:sugar_affordance:20211119075840p:plain

  • まず通常の手順通り 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 に親シーンで設定した参照用の文字列を設定します。

f:id:sugar_affordance:20211119080409p:plain

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




以上の内容はhttps://indie-du.com/entry/2021/11/19/081550より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14