はじめに

上記のような 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」属性を適用した変数を定義すれば、自動的に参照が設定されるようになります