前回SerializedObjectをまとめたので、ついでにScriptableObjectについても書いておきます。
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 }
説明はコメントに書いた通りです。
こんな感じにサブアセット化されます。
参考
anchan828.github.io ↑サブアセットのコードはちょっとおかしいかも?