サブアセットをResourcesからロードする
2021/01/16
Unity
Editor
ScriptableObject
AssetManagement
UnityのサブアセットをResourcesからロードする方法
概要
UnityのAssetにはProjectビュー上で階層構造で表示するサブアセットという機能がある。
そのサブアセットをResourcesからロードして扱う方法。
環境
- Unity 2020.2.1f1
サブアセットの生成
下記の構造を生成する。
サブアセットの生成はEditorコードで行う。AssetDatabase.AddObjectToAsset
で追加したアセットは、Projectビュー上で子オブジェクトのように表示される。
[MenuItem("Example/Create Sample Nested Asset")]
private static void CreateSampleAsset()
{
ParentClass sample = CreateInstance<ParentClass>();
ChildClass child1 = CreateInstance<ChildClass>();
child1.name = "Child1";
child1.hoge = 5;
ChildClass child2 = CreateInstance<ChildClass>();
child2.name = "Child2";
child2.hoge = 10;
const string PATH = "Assets/Resources/Sample.asset";
AssetDatabase.CreateAsset(sample, PATH);
AssetDatabase.AddObjectToAsset(child1, PATH);
AssetDatabase.AddObjectToAsset(child2, PATH);
AssetDatabase.ImportAsset(PATH);
}
Resourcesからロード
Resources.LoadAll
で親子纏めてロードする。
LoadAll
の型引数で対象の型のオブジェクトのみにフィルタリングできる。
ChildClass[] children = Resources.LoadAll<ChildClass>("Sample");
List<int> expected = new List<int>{5, 10};
CollectionAssert.AreEquivalent(expected, children.Select(x => x.hoge)); // pass
ScriptableObject[] objs = Resources.LoadAll<ScriptableObject>("Sample");
Assert.AreEqual(3, objes.Length); // pass
親アセットとサブアセットで扱いに差はないので、型指定が無ければ親を含めた全てのオブジェクトが取得される。