ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

選択したアセットを参照しているアセットを検索するエディタ拡張

概要

Unityの標準の機能にアセットを選択した状態で右クリックのメニューで「Select Dependencies」を選択すると、選択しているアセットが参照しているアセットの情報がインスペクターに表示されます。

今回はこれの逆のことがしたく、選択したアセットがどのアセットで参照されているのかが知れるように拡張してみました。

実装

環境はUnity2018.4.6f1
Script Runtime Versionは.NET 4.x Equivalentです。(文字連結を+でしたくないという我儘のため.NET3.5でも行けると思います`)

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class ReverseSelectAssetsLookupFinder
{
    [MenuItem("Assets/ReverseSelectAssetsLookupFinder")]
    private static void ReverseSelectAssetLookup()
    {
        //検索対象は全てのアセットにする
        var allAssetsPath = AssetDatabase.GetAllAssetPaths();
        
        //今回は複数選択していた場合も検索できるようにループさせる
        var selectAssets = Selection.objects;
        foreach (var selectAsset in selectAssets)
        {
            var reverseSelectAssetsLookupList = new List<string>();
            
            var targetAssetPath = AssetDatabase.GetAssetPath(selectAsset);
            for (var i = 0; i < allAssetsPath.Length; ++i)
            {
                //何も出ないのも寂しいのでプログレスバーで進捗を出す
                EditorUtility.DisplayProgressBar("reverse lookup",
                    $"{selectAsset} is Search...{i}/{allAssetsPath.Length}", (float) i / allAssetsPath.Length);

                //アセットの参照対象に選択したアセットが含まれていたら逆引き対象としてみなす
                var assetPath = allAssetsPath[i];
                var dependenciesAssets = AssetDatabase.GetDependencies(assetPath, false);
                if (dependenciesAssets.Contains(targetAssetPath))
                {
                    reverseSelectAssetsLookupList.Add(assetPath);
                }
            }
            EditorUtility.ClearProgressBar();
            //とりあえず結果が知りたいのでDebug.Logに出す
            if (reverseSelectAssetsLookupList.Count == 0)
            {
                Debug.Log($"reverse {selectAsset} lookup result : no Dependencies");
            }
            else
            {
                Debug.Log($"reverse {selectAsset} lookup result : {string.Join(",\n", reverseSelectAssetsLookupList)}");
            }
        }
    }

    [MenuItem("Assets/ReverseSelectAssetsLookupFinder", true)]
    private static bool IsValidate()
    {
        //一つ以上アセットが選択されていたら選択可能にする
        return Selection.objects != null && Selection.objects.Length > 0;
    }
}

あとがき

今回はやりたいこと優先のため簡易的なコードになりましたが、 機能性を考えると同じようにインスペクターで表示したくなりますね…努力目標で追加してみたい…。
MenuItemからインスペクターの表示ってスクリプト上でできるのかな…お詳しい方がいればお力をお借りしたい…。

参考

qiita.com