【Unity】ビルド後のAssetBundleから依存関係の情報を取得する

ビルド後のAssetBundleから依存関係の情報を取得する方法です。

Unity2018.3.9

.manifestにも書かれてるけど・・・

AssetBundleをビルドすると、ビルドしたフォルダの直下にフォルダ名と同じ名前のAssetBundleと.manifestファイルが作られます。
このうち、.manifestファイルには人間の読める文字でAssetBundle同士の依存関係が書かれています。

ManifestFileVersion: 0
CRC: 1425681598
AssetBundleManifest:
  AssetBundleInfos:
    Info_0:
      Name: materials/material01
      Dependencies:
        Dependency_0: textures/texture01
    Info_1:
      Name: materials/material02
      Dependencies:
        Dependency_0: textures/texture01
    Info_2:
      Name: prefabs/prefab01
      Dependencies:
        Dependency_0: materials/material01
        Dependency_1: materials/material02
        Dependency_2: prefabs/prefab02
    Info_3:
      Name: prefabs/prefab02
      Dependencies:
        Dependency_0: materials/material02
    Info_4:
      Name: textures/texture01
      Dependencies: {}
    Info_5:
      Name: fbx/fbx01
      Dependencies: {}
    Info_6:
      Name: scenes/scene01
      Dependencies:
        Dependency_0: prefabs/prefab01
        Dependency_1: fbx/fbx01

ただしここに書かれているDependenciesはあくまでそのAssetBundleが直接依存しているものだけであり、
あるAssetBundleが依存しているAssetBundleをすべて取得するには依存関係をたどらなければなりません。
これは人間のやるべき作業ではないのでスクリプトから操作してみます。

フォルダ名のAssetBundleから依存関係を取得する

フォルダと同じ名前のAssetBundle(.manifestではなく)を使うと、スクリプトで依存関係を得られます。
まず、フォルダと同じ名前のAssetBundleをロードして、
さらにそのAssetBundleからAssetbundleManifestという型のAssetをロードします。

var manifestAssetBundle = AssetBundle.LoadFromFile(manifestAssetBundlePath);
var manifest = manifestAssetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
manifestAssetBundle.Unload(false);

あとはこのAssetBundleManifestのGetAllDependencies()GetDirectDependencies()を使って依存関係を取得するだけです。
全ての依存しているAssetBundleを得るにはGetAllDependencies()を使います。
直接参照しているものだけを得るにはGetDirectDependencies()を使います。

// assetBundleName が直接参照しているAssetBundleを取得する
manifest.GetDirectDependencies(assetBundleName);

// assetBundleName が参照している全てのAssetBundleを取得する
manifest.GetAllDependencies(assetBundleName);