はじめに
上記のような ScriptableObject を複数のシーンから参照したい場合、
using UnityEngine; public class Example : MonoBehaviour { public MonsterTable m_monsterTable; }
このように public 変数や SerializeField 属性が適用された変数を定義して、
Inspector で参照を設定できるようにして、
各シーンの Inspector で ScriptableObject の参照を設定する必要があり、
少しめんどくさいです
この記事では、Zenject を使用して
Inspector で毎回 ScriptableObject の参照を設定しなくても済む方法を紹介していきます
検証環境
- Unity 2018.2.2f1
- Zenject 7.1.0
手順
準備
Project ビューの「Create>Zenject>Scriptable Object Installer」を選択して
作成したファイルに名前をつけます(ここでは TableInstaller と名付けました)
using UnityEngine; using Zenject; [CreateAssetMenu( fileName = "TableInstaller", menuName = "Installers/TableInstaller" )] public class TableInstaller : ScriptableObjectInstaller<TableInstaller> { public MonsterTable m_monsterTable; public override void InstallBindings() { Container.BindInstance( m_monsterTable ); } }
作成した TableInstaller.cs を開いて上記のようなコードを記述します
(ここでは ScriptableObject の名前を MonsterTable としています)
Project ビューの「Create>Installers>TableInstaller」を選択します
作成した TableInstaller の「Monster Table」の欄に、
ScriptableObject の「MonsterTable」を設定します
「Resources」フォルダを選択します
「Resources」フォルダが存在しない場合は作成して選択します
Project ビューの「Create>Zenject>Project Context」を選択します
「Scriptable Object Installers」の欄の「+」を押します
作成された欄に「TableInstaller」を設定します
ScriptableObject を参照したいシーンを開いた状態で
Hierarchy の「Create>Zenject>Scene Context」を選択します
これで準備が完了しました
参照
using UnityEngine; using Zenject; public class Example : MonoBehaviour { [Inject] private MonsterTable m_monsterTable; private void Start() { var monsterData = m_monsterTable.m_list[ 0 ]; Debug.Log( monsterData.m_name ); } }
ScriptableObject を参照したいスクリプトで
上記のように「Inject」属性を適用した変数を定義します
そして、ゲームを実行すると、自動的に参照が設定されていることが確認できます
あとは、ScriptableObject を参照したい他のシーンにも「Scene Context」を配置して、
「Inject」属性を適用した変数を定義すれば、自動的に参照が設定されるようになります