サブアセットをResourcesからロードする

2021/01/16
Unity
Editor
ScriptableObject
AssetManagement

UnityのサブアセットをResourcesからロードする方法

概要

UnityのAssetにはProjectビュー上で階層構造で表示するサブアセットという機能がある。
そのサブアセットをResourcesからロードして扱う方法。

環境

  • Unity 2020.2.1f1

サブアセットの生成

下記の構造を生成する。

SubAssets

サブアセットの生成は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

親アセットとサブアセットで扱いに差はないので、型指定が無ければ親を含めた全てのオブジェクトが取得される。

© 2019-2021 hassakulab.com, built with Gatsby