コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】【Zenject】複数のシーンで使用したい ScriptableObject の参照を自動で設定する方法

はじめに

f:id:baba_s:20180814194735p:plain

上記のような ScriptableObject を複数のシーンから参照したい場合、

using UnityEngine;

public class Example : MonoBehaviour
{
    public MonsterTable m_monsterTable;
}

このように public 変数や SerializeField 属性が適用された変数を定義して、
Inspector で参照を設定できるようにして、

f:id:baba_s:20180814195038p:plain

各シーンの Inspector で ScriptableObject の参照を設定する必要があり、
少しめんどくさいです

この記事では、Zenject を使用して
Inspector で毎回 ScriptableObject の参照を設定しなくても済む方法を紹介していきます

検証環境

  • Unity 2018.2.2f1
  • Zenject 7.1.0

手順

準備

f:id:baba_s:20180814195519p:plain

Project ビューの「Create>Zenject>Scriptable Object Installer」を選択して

f:id:baba_s:20180814195603p:plain

作成したファイルに名前をつけます(ここでは 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 としています)

f:id:baba_s:20180814195734p:plain

Project ビューの「Create>Installers>TableInstaller」を選択します

f:id:baba_s:20180814195857p:plain

作成した TableInstaller の「Monster Table」の欄に、
ScriptableObject の「MonsterTable」を設定します

f:id:baba_s:20180814201035p:plain

「Resources」フォルダを選択します
「Resources」フォルダが存在しない場合は作成して選択します

f:id:baba_s:20180814200022p:plain

Project ビューの「Create>Zenject>Project Context」を選択します

f:id:baba_s:20180814200142p:plain

「Scriptable Object Installers」の欄の「+」を押します

f:id:baba_s:20180814200147p:plain

作成された欄に「TableInstaller」を設定します

f:id:baba_s:20180814200248p:plain

ScriptableObject を参照したいシーンを開いた状態で
Hierarchy の「Create>Zenject>Scene Context」を選択します

f:id:baba_s:20180814200322p:plain

これで準備が完了しました

参照

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」属性を適用した変数を定義します

f:id:baba_s:20180814201339p:plain

そして、ゲームを実行すると、自動的に参照が設定されていることが確認できます

f:id:baba_s:20180814200322p:plain

あとは、ScriptableObject を参照したい他のシーンにも「Scene Context」を配置して、
「Inject」属性を適用した変数を定義すれば、自動的に参照が設定されるようになります

参考サイト様