概要
開きまくっていたプロジェクトウィンドウ上のフォルダ開閉状態をいったんリセットしたい場合に有効なエディタ拡張です。
使い方
-
Window/ProjectBrowserHelper
で開きます。 Collapse All
※TwoColumnレイアウトだと動作が完全ではなく、全部閉じるではなく、
現在のフォルダ以下のものだけが閉じられる挙動になっております。
環境
- Unity2019.4.13f1~
コード
Gistにもアップしました。
ProjectBrowserHelperWindow.cs
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class ProjectBrowserHelperWindow : EditorWindow
{
[MenuItem("Window/ProjectBrowserHelper")]
static void Init()
{
GetWindow<ProjectBrowserHelperWindow>();
}
void OnEnable()
{
var collapseAllButton = new Button(() => OnClickCollapseAll());
collapseAllButton.text = "Collapse All";
rootVisualElement.Add(collapseAllButton);
}
void OnClickCollapseAll()
{
Selection.activeObject = null;
var window =
Resources.FindObjectsOfTypeAll<EditorWindow>().FirstOrDefault(x => x.GetType().Name == "ProjectBrowser");
if (window == null) { return; }
new InternalProjectBrowser(window).ClearExpandedIDs();
window.Repaint();
}
/// <summary>
/// UnityEditor.ProjectBrowserのリフレクション
/// </summary>
class InternalProjectBrowser
{
SerializedObject so;
SerializedProperty AssetTreeExpandedIDsProperty => so.FindProperty("m_AssetTreeState.m_ExpandedIDs");
SerializedProperty FolderTreeExpandedIDsProperty => so.FindProperty("m_FolderTreeState.m_ExpandedIDs");
public InternalProjectBrowser(EditorWindow ProjectWindow)
{
so = new SerializedObject(ProjectWindow);
}
public void ClearExpandedIDs()
{
so.Update();
AssetTreeExpandedIDsProperty.ClearArray();
FolderTreeExpandedIDsProperty.ClearArray();
AssetTreeExpandedIDsProperty.arraySize = 0;
FolderTreeExpandedIDsProperty.arraySize = 0;
so.ApplyModifiedProperties();
Reload();
}
void Reload()
{
var methodInfo = so.targetObject.GetType().GetMethod("ResetViews", BindingFlags.Instance | BindingFlags.NonPublic);
methodInfo.Invoke(so.targetObject, new object[0]);
}
}
}
まとめ
フォルダの開閉状態を一気に閉じたい場合、便利かと思います。