【Unity】【エディタ拡張】SubAssetの取り扱いまとめ

エディタ拡張におけるSubAssetの取り扱い方のまとめです。

Unity2018.2

SubAsset?

あるAssetの子として別のAssetを内包し一つのファイルとして取り扱う機能です。

light11.hatenadiary.com

SubAssetにする

SubAssetにするにはAssetDatabase.AddObjectToAsset()を使います。
ただしすでにAsset化されているものはSubAssetにはできません。

// assetのサブアセットとしてsomeObjectを追加する
// someObjectがすでにアセット化されていたらエラー
AssetDatabase.AddObjectToAsset(someObject, asset);

// 追加した後にはアセットを再読み込みする
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(asset));

SubAssetから削除する

SubAssetを削除するにはDestroyImmediate()を使います。
第二引数をtrueにする必要があります。

// 第二引数はtrueに
DestroyImmediate(asset, true);

SubAssetを取得する

SubAssetを取得するにはAssetDatabase.LoadAllAssetsAtPath()にメインアセットのパスを渡します。

ただしこのメソッドはメインアセットも含めたすべてのアセットを取得するので、
SubAssetだけ取得したい場合には注意が必要です。

var assets     = AssetDatabase
    .LoadAllAssetsAtPath(path)
    .Where(x => AssetDatabase.IsSubAsset(x));

MainAssetかSubAssetか判定する

AssetDatabaseに判定するメソッドが用意されています。

AssetDatabase.IsMainAsset(asset)
AssetDatabase.IsSubAsset(asset)

すべてのSubAssetを削除する

こんな感じにします。

foreach (var asset in AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(this))) {
    if (AssetDatabase.IsSubAsset(asset)) {
        DestroyImmediate(asset, true);
    }
}
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();

関連

light11.hatenadiary.com