[Unity 확장] 현재 디렉터리를 강조하는 편집 확장을 만들어 보았습니다.

개시하다


프로젝트 내 폴더의 수가 증가함에 따라 현재 열린 디렉터리가 프로젝트 보기 트리의 어디에 있는지 찾기가 점점 어려워집니다.

(이미지의 폴더 구성은 이번 기사를 위해 기습적으로 만든 것인데 좀 심했나 봐...)
그래서 이번에 우리는 현재 열려 있는 디렉터리 (= 현재 디렉터리) 를 강조하는 편집 확장을 만들었다.

컨디션


Unity 5.5.0f3
Windows 10

제작에 관한 것


오른쪽 메뉴에서 한 번 클릭하면 현재 디렉터리의 편집 확장을 강조할 수 있습니다.

편리할 거예요.

소스 코드


프로젝트에 Editor 폴더를 만들고 다음 스크립트를 Editor 폴더에 삽입하십시오.
ProjectBrowserExtension.cs
namespace ProjectBrowserExtension
{
    using UnityEditor;
    using System.Reflection;
    using System.Linq;

    public class ProjectBrowserExtension
    {
        const string MenuItemName = "Assets/Highlight Current Directory";

        /// <summary>
        /// プロジェクトウィンドウでカレントディレクトリの親フォルダをハイライトする
        /// </summary>
        [MenuItem(MenuItemName)]
        static void FrameCurrentDirectory()
        {
            string currentDirectory = GetCurrentDirectory(); // カレントディレクトリ

            // カレントディレクトリ直下のファイルのパスを取得
            int depth = currentDirectory.Split('/').Length;
            string path = AssetDatabase.GetAllAssetPaths()
            .Where(assetPath => assetPath.Contains(currentDirectory)) // カレントディレクトリのファイルかどうか
            .FirstOrDefault(assetPath => assetPath.Split('/').Length == depth + 1); // カレントディレクトリ直下のファイルかどうか

            if (string.IsNullOrEmpty(path)) // カレントディレクトリにファイルが存在しない場合
            {
                FrameObjectInTwoColumnMode(GetInstanceID(currentDirectory), true, false);
                EditorApplication.delayCall += () =>
                {
                    ShowFolderContents(GetInstanceID(currentDirectory), true);
                };
            }
            else // カレントディレクトリにファイルが存在する場合
            {
                FrameObjectInTwoColumnMode(GetInstanceID(path), true, true);
            }
        }

        /// <summary>
        /// FrameCurrentDirectory()のValidate関数
        /// </summary>
        [MenuItem(MenuItemName, true, 20000)]
        static bool ValidateFrameCurrentDirectory()
        {
            return IsTwoColumn();
        }

        /// <summary>
        /// ProjectウィンドウがTwoColumnモードかどうか
        /// </summary>
        static bool IsTwoColumn()
        {
            var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
            var asm = Assembly.Load("UnityEditor.dll");
            var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
            var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);

            return typeProjectBrowser.GetField("m_ViewMode", flag).GetValue(projectBrowserWindow).ToString() == "TwoColumns";
        }

        /// <summary>
        /// pathからInstanceIDを取得
        /// </summary>
        static int GetInstanceID(string path)
        {
            return AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object)).GetInstanceID();
        }

        /// <summary>
        /// Projectウィンドウでオブジェクトをハイライトする
        /// </summary>
        static void FrameObjectInTwoColumnMode(int instanceID, bool frame, bool ping)
        {
            var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
            var asm = Assembly.Load("UnityEditor.dll");
            var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
            var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);
            typeProjectBrowser.GetMethod("FrameObjectInTwoColumnMode", flag).Invoke(projectBrowserWindow, new object[] { instanceID, frame, ping });
        }

        /// <summary>
        /// Projectウィンドウでフォルダの中身を表示
        /// </summary>
        static void ShowFolderContents(int folderInstanceID, bool revealAndFrameInFolderTree)
        {
            var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
            var asm = Assembly.Load("UnityEditor.dll");
            var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
            var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);
            typeProjectBrowser.GetMethod("ShowFolderContents", flag).Invoke(projectBrowserWindow, new object[] { folderInstanceID, revealAndFrameInFolderTree });
        }

        /// <summary>
        /// Projectウィンドウで現在開いているディレクトリを取得
        /// </summary>
        static string GetCurrentDirectory()
        {
            var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
            var asm = Assembly.Load("UnityEditor.dll");
            var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
            var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);
            return (string)typeProjectBrowser.GetMethod("GetActiveFolderPath", flag).Invoke(projectBrowserWindow, null);
        }
    }
}

편집을 사용하여 확장


마우스 오른쪽 버튼 메뉴에서 Highlight 현재 Directory 를 선택하면 됩니다.현재 디렉토리를 강조 표시합니다.

편집과 확장을 거치지 않고 같은 일을 하다


편집 확장 후 빵 부스러기 목록의 현재 디렉터리를 클릭하면 폴더를 강조할 수 있습니다.

만약 폴더의 차원이 너무 깊다면, 빵 부스러기 목록이 화면 밖을 넘어서면, 이 편집의 확장이 매우 편리할 것이다.(완료)

좋은 웹페이지 즐겨찾기