【Unity】【エディタ拡張】ScriptableObjectの勘所をまとめてみる

前回SerializedObjectをまとめたので、ついでにScriptableObjectについても書いておきます。

light11.hatenadiary.com

ScriptableObjectとその用途

ScriptableObjectを利用すると独自の形式のアセットを作成できます。
具体的な用途は下記のような感じかなと思います。

  • 静的なパラメータの保存先とする
  • モデルのアセットのように、いくつかのアセットをサブアセット化して一つのアセットとする
  • 例えば独自フォーマットのテクスチャなど、独自フォーマットのオブジェクトを作る

作り方1

まず、ScriptableObjectの作り方です。
作り方は2通りあるので、まず1つ目です。

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

// ScriptableObjectを継承する
public class ScriptableObjectTest : ScriptableObject {

#if UNITY_EDITOR
    [MenuItem("ScriptableObjectTest/Create")]
    public static void Create()
    {
        // ScriptableObject.CreateInstance()でインスタンスを生成
        // この時点ではアセット化はされていない
        var asset = CreateInstance<ScriptableObjectTest>();

        // アセット化するにはAssetDatabase.CreateAsset()
        // 拡張子は必ず.assetとする
        AssetDatabase.CreateAsset(asset, "Assets/scriptable_object_test.asset");
        AssetDatabase.Refresh();
    }
#endif
}

説明はコメントに書いた通りです。

作り方2

CreateAssetMenuアトリビュートを使うと右クリックから簡単にインスタンス化できます。
これが2つ目の作り方です。

こちらはスクリプターが頻繁に作成するようなデータなどにいいかもしれません。

using UnityEngine;

[CreateAssetMenu(menuName = "ScriptableObjectTest/Create")]
public class ScriptableObjectTest : ScriptableObject {
}

サブアセット

ScriptableObjectで作った複数のアセットをまとめて一つのアセットとして取り扱うことができます。

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ScriptableObjectTest : ScriptableObject {
        
#if UNITY_EDITOR
    [MenuItem("ScriptableObjectTest/Create")]
    public static void Create()
    {
        // 親を作成
        var parent = CreateInstance<ScriptableObjectTest>();

        // 子を作成
        var child = CreateInstance<ScriptableObjectTest>();
        child.name = "child";

        // parentのみアセット化しておく
        AssetDatabase.CreateAsset(parent, "Assets/scriptable_object_test.asset");

        // childをparentのサブアセットにする
        AssetDatabase.AddObjectToAsset(child, parent);

        // アセットをReimportするとサブアセットが反映される
        AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(parent));
    }
#endif
}

説明はコメントに書いた通りです。
こんな感じにサブアセット化されます。

f:id:halya_11:20180316135539p:plain

参考

anchan828.github.io ↑サブアセットのコードはちょっとおかしいかも?

tsubakit1.hateblo.jp