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);
}
}
まとめ
ScriptableObject のサンプルコードを載せてみました。
使いたくなった時にすぐ使えるように、サンプルコードを整理しておくことも大事だと思います。
コメント