Project View のファイル名の横にフォルダ名を表示する

Unityでファイル名を検索した時、「検索結果のファイルがどのフォルダのものだっけ?」となることないでしょうか?

僕は同じファイル名が複数ある場合におきます(そのような設計をしてなければ問題ない話)

Unity の Project View でファイル目の横にフォルダパスを表示する拡張機能を作ってみました

f:id:toshizabeth:20200315180727p:plain

特に説明することもないですが EditorPrefs で表示をいつでもON/OFF切り替えられるようにしました。

/// <summary>
/// Project View にファイルのパスを表示する拡張機能
/// </summary>
[InitializeOnLoad]
public class ProjectViewPathDisplay
{
    private const string MenuItemPath = "Tools/View/ProjectViewPathDisplay/パス表示";
    private const string PrefsKey = "ProjectViewPathDisplay";

    private static GUIStyle _style;
    private static bool _enable;
    private static List<string> _removePathLists = new List<string> 
        { 
            @"Assets\",
            @"App\",
            @"Scripts\",
        };

    static ProjectViewPathDisplay()
    {
        EditorApplication.projectWindowItemOnGUI -= OnGUI;
        EditorApplication.projectWindowItemOnGUI += OnGUI;

        _enable = EditorPrefs.GetBool(PrefsKey, false);
    }

    private static void OnGUI(string guid, Rect selectionRect)
    {
        if (!_enable) return;

        var assetPath = AssetDatabase.GUIDToAssetPath(guid);

        if (string.IsNullOrWhiteSpace(assetPath)) return;

        // ディレクトは除外する
        if (Directory.Exists(assetPath)) return;

        // ファイル名
        var filename = Path.GetFileNameWithoutExtension(assetPath);

        if (_style == null)
        {
            _style = new GUIStyle(EditorStyles.label);
            _style.normal.textColor = new Color(0.4f, 0.4f, 0.4f);
        }

        selectionRect.x += _style.CalcSize(new GUIContent(filename)).x + 30;


        // ディレクトリパスにする
        assetPath = Path.GetDirectoryName(assetPath);

        // いらないパスは削除
        foreach (var path in _removePathLists)
        {
            assetPath = assetPath.Replace(path, "");
        }

        GUI.Label(selectionRect, assetPath, _style);
    }

    /// <summary>
    /// Windowメニューに追加。
    /// 表示非表示を切り替える
    /// </summary>
    [MenuItem(MenuItemPath)]
    private static void ShowWindow()
    {
        var menuChecked = Menu.GetChecked(MenuItemPath);
        _enable = !menuChecked;
        Menu.SetChecked(MenuItemPath, _enable);

        // 保存
        EditorPrefs.SetBool(PrefsKey, _enable);
    }
}

assetPath に「.cs が含まれているか」を入れればスクリプトファイルのみ対象になります。

削除するパスはScriptableObject で管理しても良さそう