【Unity】ScriptableObject のサンプルコード

Projectビュー Unity
Projectビュー

ScriptableObject のサンプルコードを載せておきます。

ScriptableObject のサンプルコード

ScriptableObject

ScriptableObject は、実行時に読み取り専用になるデータです。
Unityエディター上で事前にデータを作成しておいて、ゲーム内で参照するデータとして使用します。

サンプルコード

データ

MyScriptableObject がアセットとして、ゲーム内から参照するデータになります。
サンプルでは、データ内に MyData1 や MyData2 を持っている構成にしました。

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "TestScriptableObject/MyScriptableObject", fileName = "MyScriptableObject")]
public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    private MyData1 m_rMyData1 = null;
    [SerializeField]
    private List<MyData2> m_arMyData2 = new List<MyData2>();

    public MyData1 MY_DATA_1 { get { return m_rMyData1; } }
    public List<MyData2> LIST_MY_DATA_2 { get { return m_arMyData2; } }

    public void SetMyData1(MyData1 rMyData1)
    {
        m_rMyData1 = rMyData1;
    }

    public void AddMyData2(MyData2 rMyData2)
    {
        m_arMyData2.Add(rMyData2);
    }

    public void ClearMyData2()
    {
        m_arMyData2.Clear();
    }
}
using System.Collections.Generic;

[System.Serializable]
public class MyData1
{
    public int Int1 = 0;
    public float Float1 = 0;
    public List<int> IntList1 = new List<int>();
    public List<float> FloatList1 = new List<float>();
}
using System.Collections.Generic;

[System.Serializable]
public class MyData2
{
    public int Int2 = 0;
    public float Float2 = 0;
    public List<int> IntList2 = new List<int>();
    public List<float> FloatList2 = new List<float>();
}

メニュー操作

アセットの作成

Unityエディター上でアセットを作成します。

    [MenuItem("MyScriptableObject/CreateMyScriptableObject")]
    private static void CreateMyScriptableObject()
    {
        string assetPath = "Assets/Resources/";

        // MyScriptableObjectの作成.
        MyScriptableObject rMyScriptableObject = ScriptableObject.CreateInstance<MyScriptableObject>();
        MyData1 rMyData1 = new MyData1();
        rMyData1.Int1 = 1;
        rMyData1.Float1 = 1.2f;
        rMyData1.IntList1.Add(1);
        rMyData1.FloatList1.Add(1.2f);
        rMyScriptableObject.SetMyData1(rMyData1);
        for (int i=0; i < 3; i++)
        {
            MyData2 rMyData2 = new MyData2();
            rMyData2.Int2 = i * 2;
            rMyData2.Float2 = i * 2.3f;
            for (int j=0; j < 3; j++)
            {
                rMyData2.IntList2.Add(i + j * 3);
                rMyData2.FloatList2.Add(i + j * 3.4f);
            }
            rMyScriptableObject.AddMyData2(rMyData2);
        }

        // アセットの作成.
        string assetName = $"{assetPath}MyScriptableObject.asset";
        AssetDatabase.CreateAsset(rMyScriptableObject, assetName);

        // インポート.
        AssetDatabase.Refresh();
    }
アセットの編集

Unityエディター上でアセットを編集します。
SetDirty() を呼ばないと保存されないようです。

    [MenuItem("MyScriptableObject/EditMyScriptableObject")]
    private static void EditMyScriptableObject()
    {
        // MyScriptableObjectの編集.
        string path = "MyScriptableObject";
        MyScriptableObject rMyScriptableObject = Resources.Load<MyScriptableObject>(path);
        rMyScriptableObject.LIST_MY_DATA_2[0].Int2 = 1002;

        // SetDirty()しないと保存されないらしい.
        EditorUtility.SetDirty(rMyScriptableObject);

        // 保存する.
        AssetDatabase.SaveAssets();
    }

ゲーム内で使用する

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        // MyScriptableObjectのロード.
        string path = "MyScriptableObject";
        MyScriptableObject rMyScriptableObject = Resources.Load<MyScriptableObject>(path);

        // ログ出力.
        Debug.Log(rMyScriptableObject.LIST_MY_DATA_2[0].Int2);
    }
}
Projectビュー
Projectビュー
Hierarchyビュー
Hierarchyビュー

まとめ

ScriptableObject のサンプルコードを載せてみました。
使いたくなった時にすぐ使えるように、サンプルコードを整理しておくことも大事だと思います。

コメント

タイトルとURLをコピーしました