Scriptable Object Installer を使ってみた【Extenject (Zenject)】

Extenject の Scriptable Object Installer を利用したのでメモ。
今まで脳死で Zenject Binding で Bind していたので、ちゃんと Installer を使っていこうという。

Scriptable Object Installer

Scriptable Object を Installer として使うためのクラス。その名の通り。

使い方

Bind する Scriptable Object の作成

適当に Bind する Scriptable Object を作ります。SampleSOとします。

using System;
using UnityEngine;

namespace xrdnk
{
    [Serializable]
    [CreateAssetMenu(menuName = "xrdnk/Create SampleSO", fileName = "SampleSO")]
    public class SampleSO : ScriptableObject
    {
        [SerializeField] private string _Name;

        public string Name => _Name;
    }
}

SampleSO.asset を適当に作ります。Name には名前を入れます。

Scriptable Object Installer を作る

Create > Zenject > Scriptable Object Installer で作成します。
こちらの手順を通して作成すると、予めテンプレートが入った状態で作成してくれるので便利です。

using UnityEngine;
using Zenject;

namespace xrdnk
{
    [CreateAssetMenu(fileName = "SOSampleInstaller", menuName = "Installers/SOSampleInstaller")]
    public class SOSampleInstaller : ScriptableObjectInstaller<SOSampleInstaller>
    {
        [SerializeField]
        private SampleSO _SampleSO;

        public override void InstallBindings()
        {
            Container.BindInstance(_SampleSO).AsCached();
        }
    }
}

以上のように、BindInstance では SampleSO を設定します。
SOSampleInstaller.asset を作成します。SampleSO には 先ほど作成した SampleSO.asset を設定します。

Scene Context に 設定

Hierarchy に Scene Context を作成し、Scriptable Object Installers に先ほど作成した SOSampleInstaller.asset を設定します。

ここまでで Bind 設定が完了しました。

Inject 確認

以下のようなサンプルスクリプトを作成します。

using UnityEngine;
using Zenject;

namespace xrdnk
{
    public class SampleSOTest : MonoBehaviour
    {
        private SampleSO _SampleSO;

        [Inject]
        public void Construct(SampleSO sampleSO)
        {
            _SampleSO = sampleSO;
            Debug.Log($"My name is {_SampleSO.Name}. Nice to meet you.");
        }
    }
}

期待結果としてはコンソールで、My name is xrdnk. Nice to meet you. が出るはずです。確認してみます。

期待通りの結果になりました。
Scriptable Object でマスタデータや設定用のパラメータを持たせることが多いので、
このように Scriptable Object Installer を利用すると便利かもしれません。