いんでぃーづ

ゲームいろいろ、いろいろ自由

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


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。