Skip to content

Instantly share code, notes, and snippets.

@baba-s
Last active January 1, 2019 02:34

Revisions

  1. baba-s revised this gist Jan 1, 2019. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion HierarchyCollapser.cs
    Original file line number Diff line number Diff line change
    @@ -6,7 +6,7 @@

    public static class HierarchyCollapser
    {
    [MenuItem( "Tools/Collapser Hierarchy _F4" )]
    [MenuItem( "Tools/Collapse Hierarchy _F4" )]
    private static void Collapse()
    {
    var nonPublicStatic = BindingFlags.NonPublic | BindingFlags.Static;
  2. baba-s created this gist Jan 1, 2019.
    59 changes: 59 additions & 0 deletions HierarchyCollapser.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    using System.Collections.Generic;
    using System.Reflection;
    using UnityEditor;
    using UnityEditor.SceneManagement;
    using UnityEditorInternal;

    public static class HierarchyCollapser
    {
    [MenuItem( "Tools/Collapser Hierarchy _F4" )]
    private static void Collapse()
    {
    var nonPublicStatic = BindingFlags.NonPublic | BindingFlags.Static;
    var nonPublicInstance = BindingFlags.NonPublic | BindingFlags.Instance;
    var assemblypath = InternalEditorUtility.GetEditorAssemblyPath();
    var assembly = Assembly.LoadFrom( assemblypath );
    var type = assembly.GetType( "UnityEditor.SceneHierarchyWindow" );
    var hierarchyfield = type.GetField( "s_LastInteractedHierarchy", nonPublicStatic );
    var hierarchy = hierarchyfield.GetValue( type );
    var hierarchyType = hierarchy.GetType();
    var sceneviewfield = hierarchyType.GetField( "m_SceneHierarchy", nonPublicInstance );
    var sceneview = sceneviewfield.GetValue( hierarchy );
    var sceneviewType = sceneview.GetType();
    var treestatefield = sceneviewType.GetField( "m_TreeViewState", nonPublicInstance );
    var treestate = treestatefield.GetValue( sceneview );
    var expandedIdsField = treestate.GetType().GetField( "m_ExpandedIDs", nonPublicInstance );

    expandedIdsField.SetValue( treestate, new List<int>() );

    var openscenes = new List<string>();

    for ( int i = 0; i < EditorSceneManager.sceneCount; i++ )
    {
    openscenes.Add( EditorSceneManager.GetSceneAt( i ).name );
    }

    var reloadneeded = sceneviewType.GetField( "m_TreeViewReloadNeeded", nonPublicInstance );

    sceneviewType.InvokeMember
    (
    name : "SetScenesExpanded",
    invokeAttr : BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
    binder : null,
    target : sceneview,
    args : new object[ 1 ] { openscenes }
    );

    reloadneeded.SetValue( sceneview, true );

    sceneviewType.InvokeMember
    (
    name : "SyncIfNeeded",
    invokeAttr : BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
    binder : null,
    target : sceneview,
    args : null
    );

    }
    }