そういえば[Unity]Excelでデータを管理してUnity iOS/Androidで使うワークフローをノーコーディングで使えるようにした等でScriptableObjectを作る方法を紹介したが使う方法を紹介していなかったので、紹介。
ScriptableObjectについては[Unity]ScriptableObjectの使い方をどうぞ。
参照する方法だが、非常に簡単だ。
- プレハブと同じように、publicや[SerializeField]を使用して
inspectorからD&Dで参照出来るようにする。 - Resourcesから呼び出して登録する
例えば以下のScriptableObjectを作るとする。
using UnityEngine;
public class TestData : ScriptableObject
{
public int count;
public string msg;
}
using UnityEngine;
public class CallTestData : MonoBehaviour
{
public TestData m_testData;
void Update ()
{
Debug.Log (m_testData.count);
Debug.Log (m_testData.msg);
}
}
もしドラッグ&ドロップが面倒な場合、Resourcesから呼び出すことも出来る。下のコードではStartのタイミングでResourcesフォルダに配置したtestdata.assetファイルをを呼び出している。
using UnityEngine;
public class CallTestData : MonoBehaviour
{
private TestData m_testData;void Start ()
{
m_testData = Resources.Load<TestData> ("testdata");
}void Update ()
{
Debug.Log (m_testData.count);
Debug.Log (m_testData.msg);
}
}
呼び出しと言えば、実はScripableObjectは継承して使用することが出来る。継承して挙動をoverride(上書き)することで、状況によりScriptableObjectを差し替える事で挙動を判断するAIライクな事も可能になる。
例えばTestDataを継承してTestDataAとTestDataBを用意する。またTestDataにはインターフェース宜しくabstructやvertualのメソッドを用意しておく。その後、処理を記述。
public class TestData : ScriptableObject
{
public int count;
public string msg;public virtual string GetMessage ()
{
return null;
}
}
public class TestDataA : TestData
{
public override string GetMessage ()
{
return "TestDataA " + this.msg;
}
}
後は各々のScriptableObjectを差し替えるだけで、ScriptableObjectに登録したメソッドの挙動を切り替える。下の図は実際にTestDataAとTestDataBのScriptableObjectを差し替え、GetMessageを呼び出した時の動作だ。public class TestDataB : TestData
{
public override string GetMessage ()
{
return "TestDataB " + this.msg;
}
}
(質問は大歓迎です)