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 を利用すると便利かもしれません。