この記事でのバージョン
Unity 2019.4.9f1
はじめに
今回はオブジェクトやPrefabが依存する全てのアセットを取得する
EditorUtility.CollectDependenciesというメソッドの紹介記事です。
roots に依存するすべてのアセットを計算し、取得します
また、EditorUtility.CollectDependenciesを使って
依存するアセットを検索するツールも作ってみたのでそちらも紹介しています。
ちなみにここで言う「依存しているアセット」とは「使っているアセット」の事で、
例えば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); } } }