(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



オブジェクトやPrefabが依存する(使っている)全てのアセットを取得する EditorUtility.CollectDependencies【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2019.4.9f1


はじめに

今回はオブジェクトやPrefabが依存する全てのアセットを取得する

EditorUtility.CollectDependenciesというメソッドの紹介記事です。

roots に依存するすべてのアセットを計算し、取得します


また、EditorUtility.CollectDependenciesを使って

依存するアセットを検索するツールも作ってみたのでそちらも紹介しています。

f:id:kan_kikuchi:20201015070219g:plain


ちなみにここで言う「依存しているアセット」とは「使っているアセット」の事で、

例えば3Dモデルならモデルのメッシュやマテリアル

そのマテリアルに使われている画像やシェーダー等が該当します。


なお、記事中では以下のアセットを使っています。

Japanese Apartment | 3D Environments | Unity Asset Store



EditorUtility.CollectDependencies

さっそくEditorUtility.CollectDependenciesの使い方ですが、

引数に対象のオブジェクトを配列で渡すだけで、そのオブジェクトが依存している物を取得出来ます。

//objはObjectで、依存するアセットを取得したい対象、dependenciesObjectsが依存するアセット群
Object[] dependenciesObjects  = EditorUtility.CollectDependencies(new Object[] { obj });


例えば指定したオブジェクトが依存するアセットを全て表示するウィンドウは以下のような感じに。

ちなみにHierarchy上のオブジェクトにもProject上のPrefabにも使う事が出来ます。

using UnityEngine;
using UnityEditor;

/// <summary>
/// EditorUtility.CollectDependenciesを試すサンプル
/// </summary>
public class CollectDependenciesExample : EditorWindow {
    
  //EditorUtility.CollectDependenciesを使う対象のオブジェクト
  private GameObject _targetObject = null;
  
  //対象のオブジェクトが依存しているオブジェクト群
  private Object[] _dependenciesObjects;

  //=================================================================================
  //表示
  //=================================================================================

  //メニューからウィンドウを開く
  [MenuItem("Example/Collect Dependencies")]
  public static void Open (){
    CollectDependenciesExample.GetWindow(typeof(CollectDependenciesExample));
  }

  //=================================================================================
  //GUIの更新
  //=================================================================================

  private void OnGUI() {
    //対象のオブジェクト取得
    _targetObject = EditorGUILayout.ObjectField("", _targetObject, typeof(GameObject), allowSceneObjects:true) as GameObject;
    
    //ボタンが押されたら依存関係の取得
    if (GUILayout.Button("依存関係を取得")) {
      _dependenciesObjects = EditorUtility.CollectDependencies(new Object[] { _targetObject });
    }

    //依存しているオブジェクトの表示
    if (_dependenciesObjects == null) {
      return;
    }
    foreach (var dependenciesObject in _dependenciesObjects) {
      EditorGUILayout.ObjectField(dependenciesObject.name, dependenciesObject, typeof(Object), allowSceneObjects:true);
    }
    
  }

}
f:id:kan_kikuchi:20201015070219g:plain