Extenject(Zenject)を入れてUnityでDIコンテナを試してみる

概要

みなさんこんにちは!

今日は、実際にExtenject(Zenject)をUnityに導入し、簡単なInjectionを行って行こうかと思います。

まずはインスコ

・AssetStoreのWindowをUnity中で開きます。

・AssetStoreの検索欄に「Extenject」と入力します。

Extenjectが検索候補に出てくるので選択します。

DownLoadButtonを押下します。

DownLoad完了後にImportにボタン表示が切り替わるので再度押下します。

Importされるアセット群がダイアログで表示されるので、そのままImportボタンを押下

これにて、プロジェクトへのインポートが完了しました。

何はともあれ、とりあえずZenjectでInject(注入)してみる

まずは、作成したScriptを入れるフォルダを作成する

Assets -> Scripts配下に Actor ,Data,Installer,Interface

のフォルダーを作成する

Interfaceを作成する

Interfaceフォルダ配下に IDataHolderという名前のC#スクリプトを作成します。

以下のように編集します。

using System.Collections.Generic;
public interface IDataHolder<T>
{
    List<T> Data { get; }
}

注入するDataを作成する

今回は開発確認用のStubモジュールdataを作成しそのdataを注入して確認できるようにします。

Assets/Scripts/Data配下に、StubUserNameMasterを作成します。

StubUserNameMaster中のコード記載を以下のようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StubUserNameMaster : IDataHolder<string>
{

    public List<string> Data => new List<string>(){"テスト用の","データ","が入る","アルヨ"};
}

Installerを作成する

Assets/Scripts/InstallerをProject中で選択し右クリック -> Create -> Zenject -> Installer

を選択します。

今回は「StubDataInstaller」という名前でInstallerを作成しました。

以下のようにコードを記載します。

using UnityEngine;
using Zenject;
public class StubDataInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container
            .Bind<IDataHolder<string>>()
            .To<StubUserNameMaster>()
            .AsTransient();
    }
}

DataのUserを作成する

Assets/Scripts/Actorを選択しDataUseActorのScriptを作成します。

また、以下のように記載します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Zenject;

public class DataUseActor : MonoBehaviour
{
    [Inject]
    private IDataHolder<string> data;

    void Start()
    {
        //正常にDataがInjectedされたかどうか出力して確認してみる!
        data.Data.ForEach(d=>Debug.Log(d));
    }

}

実際にシーンにモジュールを配置して動きを確認してみる

Hierarchy中の何もないところで、右クリック

Zenject -> SceneContext を選択します。

Hierarchy中にSceneContextが作成されました。

次に、Hierarchy中でCreateEmptyを選択し空のGameObjectを作成します。

StubDataInstallerという名前に変えます。

AddComponentからStubDataInstallerを追加します。

SceneContextをHierarchyで選択しMonoInstallersの+ボタンを押下します。

押下した後にInstallerを追加できる欄ができますので、そこに先ほど作成した

StubDataInstallerをドラッグアンドドロップします。

また、Hierarchy中で右クリック -> CreateEmptyを選択します。

名称をDataUseActorとします。

AddComponentからDataUseActorをAttachします。

シーンを起動して実行してみます!

シーンを起動するとDataUseActor中に注入されたStubDataがConsoleに出力されました。

今回のSampleは何を行っていたのか?

MonoInstallersで設定したInstallerからDataUseActorにDataが注入されています。

今回の実装の何が良いのか???(まとめ)

今回の実装でStubのDataをInjectしたのですが、本番用のDataに切り替えたいときに、

実装側のロジックを変えずに、MonoInstallersで設定しているInstallerを本番用のものに変えるだけで切り替えを行うことができます。

このような感じで手動でFactoryなどを使ってDIないし、ZenjectのようなDIコンテナを使うことで柔軟にモジュールを切り替えることができるようになります。