はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】依存するアセットを一覧で表示してくれるEditorUtility.CollectDependencies

はじめに

今回はEditorUtility.CollectDependenciesという依存する全てのアセットを取得できる便利メソッドを紹介したいと思います。

docs.unity3d.com

f:id:hanaaaaaachiru:20220117024813p:plain
動作している様子

EditorUtility.CollectDependencies

public static Object[] CollectDependencies (Object[] roots);

引数に入れたオブジェクトの配列(別にGameObject限定というわけではないので注意)が依存しているオブジェクトを返してくれます。

f:id:hanaaaaaachiru:20220117010142p:plain
CollectDependencies

活用例

公式サンプル

公式サンプルとして、ゲームオブジェクトが依存するオブジェクトを選択するエディタ拡張が紹介されていました。

using UnityEngine;
using UnityEditor;

public class CollectDependenciesExample : EditorWindow
{
    static GameObject obj = null;


    [MenuItem("Example/Collect Dependencies")]
    static void Init()
    {
        // Get existing open window or if none, make a new one:
        CollectDependenciesExample window = (CollectDependenciesExample)EditorWindow.GetWindow(typeof(CollectDependenciesExample));
        window.Show();
    }

    void OnGUI()
    {
        obj = EditorGUI.ObjectField(new Rect(3, 3, position.width - 6, 20), "Find Dependency", obj, typeof(GameObject)) as GameObject;

        if (obj)
        {
            Object[] roots = new Object[] { obj };

            if (GUI.Button(new Rect(3, 25, position.width - 6, 20), "Check Dependencies"))
                Selection.objects = EditorUtility.CollectDependencies(roots);
        }
        else
            EditorGUI.LabelField(new Rect(3, 25, position.width - 6, 20), "Missing:", "Select an object first");
    }

    void OnInspectorUpdate()
    {
        Repaint();
    }
}

EditorUtility-CollectDependencies - Unity スクリプトリファレンス

f:id:hanaaaaaachiru:20220117010503p:plain
動作させた例

ちなみにSelection.objectsを利用することで、任意のオブジェクトを選択したり、選択しているオブジェクトを取得したりできるみたいです。

public static Object[] objects ;

docs.unity3d.com

ヒエラルキー上のゲームオブジェクトが依存しているオブジェクトを調べる

次はヒエラルキー上のゲームオブジェクトが依存しているオブジェクトを調べてみるコードを書いてみます。

public static class HierarchyDependenciesCollector
{
    [MenuItem("Tools/Collect Hierarchy Dependencies")]
    public static void Execute()
    {
        // ヒエラルキー上の全てのオブジェクトを取得
        GameObject[] gameObjects = Resources.FindObjectsOfTypeAll(typeof(GameObject))
            .Select(c => c as GameObject)
            .Where(c => c != null && c.hideFlags != HideFlags.NotEditable && c.hideFlags != HideFlags.HideAndDontSave)
            .ToArray();

        // 依存先のオブジェクトを選択
        Selection.objects = EditorUtility.CollectDependencies(gameObjects);
    }
}
f:id:hanaaaaaachiru:20220117012540p:plain
実行結果

またヒエラルキー上のゲームオブジェクトを取得するのはこちらでいけるみたいです。(結構昔に書いた記事なのでワンチャン間違っているかもですが)
【Unity】Hierarchy上のゲームオブジェクト(コンポーネント)を全て取得する方法 - はなちるのマイノート

選択しているオブジェクトの依存先を調べる

public static class SelectedObjectDependenciesCollector
{
    [MenuItem("GameObject/Collect Dependencies", false, 0)]
    public static void Execute()
    {
        // 選択しているオブジェクト取得
        var selectedObjects = Selection.objects;

        // 依存先のオブジェクトを選択
        Selection.objects = EditorUtility.CollectDependencies(selectedObjects);
    }
}
f:id:hanaaaaaachiru:20220117024813p:plain
動作している様子


またMenuItem属性は結構色々な設定の仕方があるので、興味がある方は以下の記事が参考になるかと思います。
kan-kikuchi.hatenablog.com

UnityEditor.MenuItem - Unity スクリプトリファレンス