ProjectWindow で現在選択されているフォルダか、そのファイルの親フォルダの取得


Editor スクリプトで現在選択されている ProjectBrowser 内のパスを取るときに、表示が1カラムか2カラムかでちょっと挙動が変わるので処理をわけて取得したときのメモ。

private static string GetActiveFolderPath()
{
    EditorWindow window = Resources.FindObjectsOfTypeAll<EditorWindow>()
        .FirstOrDefault(w => w.GetType().Name == "ProjectBrowser");

    if (window == default) throw new NullReferenceException("ProjectBrowser が見つかりません");

    string path;

    int columnMode = (int)window.GetType().GetField("m_ViewMode", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(window);

    if (columnMode == (int) ViewMode.OneColumn)
    {
        Object obj = Selection.activeObject;

        if (obj == default)
        {
            throw new Exception("選択されていません");
        }

        path = AssetDatabase.GetAssetPath(obj.GetInstanceID());

        if (!Directory.Exists(path))
        {
            List<string> folders = path.Split('/').ToList();
            folders.RemoveAt(folders.Count - 1);
            path = string.Join("/", folders);
        }
    }
    else if (columnMode == (int) ViewMode.TwoColumns)
    {
        MethodInfo methodInfo = window.GetType().GetMethod("GetActiveFolderPath", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance);
        path = (string)methodInfo.Invoke(window, null);
    }
    else
    {
        throw new Exception("カラムタイプの判定に失敗しました");
    }

    return path;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です