テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

作成したScriptableObjectを呼び出す

そういえば[Unity]Excelでデータを管理してUnity iOS/Androidで使うワークフローをノーコーディングで使えるようにした等でScriptableObjectを作る方法を紹介したが使う方法を紹介していなかったので、紹介。

ScriptableObjectについては[Unity]ScriptableObjectの使い方をどうぞ。



参照する方法だが、非常に簡単だ。
  1. プレハブと同じように、publicや[SerializeField]を使用して
    inspectorからD&Dで参照出来るようにする。
  2. Resourcesから呼び出して登録する

例えば以下のScriptableObjectを作るとする。


using UnityEngine;

public class TestData : ScriptableObject
{
    public int count;
    public string msg;
}

呼び出したいスクリプトにpublic ScriptableObject名 変数名 と宣言し、後はドラッグ&ドロップでScriptableObjectを登録すれば呼び出すことが出来る。つまりプレハブと同じ感じだ。


using UnityEngine;

public class CallTestData : MonoBehaviour
{
    public TestData m_testData;

   
void Update ()
    {
        Debug.Log (m_testData.count);
        Debug.Log (m_testData.msg);
    }
}

スクリーンショット 2014-03-22 0.56.02

もしドラッグ&ドロップが面倒な場合、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;
    }
}

public class TestDataB : TestData
{
    public override string GetMessage ()
    {
        return "TestDataB " + this.msg;
    }
}

後は各々のScriptableObjectを差し替えるだけで、ScriptableObjectに登録したメソッドの挙動を切り替える。下の図は実際にTestDataAとTestDataBのScriptableObjectを差し替え、GetMessageを呼び出した時の動作だ。

 スクリーンショット 2014-03-22 1.11.28

スクリーンショット 2014-03-22 1.11.13



(質問は大歓迎です)