Unity3D扩展编辑器-使用脚本展开组件

转自 https://www.xuanyusong.com/archives/3784

版本Unity5.3.0

Inspector视图中的所有组件,如果想展开必须用鼠标点击一下左上角的小箭头。昨天有朋友问我能不能通过脚本来动态展开或者关闭。
在这里插入图片描述
可以用反射来做直接上代码~

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Reflection;
using System;
 
public class MyEditor : Editor  
{
	[MenuItem("Test/Test")]
	static void Start () 
	{
		var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");
		var window = EditorWindow.GetWindow(type);
		FieldInfo info = type.GetField("m_Tracker", BindingFlags.NonPublic | BindingFlags.Instance);
		ActiveEditorTracker tracker = info.GetValue(window)  as ActiveEditorTracker;
 
		for(int i = 0; i< tracker.activeEditors.Length; i++)
		{
			//可以通过名子单独判断组件展开或不展开
			if(tracker.activeEditors[i].target.GetType().Name != "NewBehaviourScript")
			{
				//这里1就是展开,0就是合起来
				tracker.SetVisible(i,1);
			}
		}
	}
}

如下图所示,我的组件都展开了。

在这里插入图片描述

[MenuItem( "CONTEXT/Component/Fold All" )]
public static void FoldAll( MenuCommand command )
{
    ActiveEditorTracker editorTracker = ActiveEditorTracker.sharedTracker;
    Editor[] editors = editorTracker.activeEditors;

    bool areAllFolded = true;
    for( int i = 1; i < editors.Length; i++ )
    {
        if( editorTracker.GetVisible( i ) != 0 )
        {
            areAllFolded = false;
            break;
        }
    }

    for( int i = 1; i < editors.Length; i++ )
    {
        editorTracker.SetVisible( i, areAllFolded ? 1 : 0 );
    }
}

最后百度到了大佬的一个

using UnityEditor;  
using System.Reflection;  
/// &lt;summary&gt;  
/// 描述:全部 展开/收起 Inspector面板的所有组件、  
/// author:  
/// todo 还可以深度定制,添加两个按钮切换  
/// &lt;/summary&gt;  
//[CustomEditor(typeof(Transform))]  
public class InspectorManagerEditor : Editor  
{  
    #region ===字段===  
    #endregion  
    #region ===Unity事件=== 快捷键: Ctrl + Shift + M /Ctrl + Shift + Q  实现  
    // 显示两个可以点击的Button   
    //[MenuItem("MyTools/InspectorManager/全部展开组件... %#&amp;m")]  
    [MenuItem("MyTools/InspectorManager/全部展开组件...")]  
    static void Expansion()  
    {  
        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");  
        var window = EditorWindow.GetWindow(type);  
        FieldInfo info = type.GetField("m_Tracker", BindingFlags.NonPublic | BindingFlags.Instance);  
        ActiveEditorTracker tracker = info.GetValue(window) as ActiveEditorTracker;  
        for (int i = 0; i < tracker.activeEditors.Length; i++)  
        {  
            ////可以通过名子单独判断组件展开或不展开  
            //if (tracker.activeEditors[i].target.GetType().Name != "NewBehaviourScript")  
            //{  
            //这里1就是展开,0就是合起来  
            tracker.SetVisible(i, 1);  
            //}  
        }  
    }  
    //[MenuItem("MyTools/InspectorManager/全部收起组件... %#&amp;n")]  
    [MenuItem("MyTools/InspectorManager/全部收起组件...")]  
    static void Shrinkage()  
    {  
        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");  
        var window = EditorWindow.GetWindow(type);  
        FieldInfo info = type.GetField("m_Tracker", BindingFlags.NonPublic | BindingFlags.Instance);  
        ActiveEditorTracker tracker = info.GetValue(window) as ActiveEditorTracker;  
        for (int i = 0; i < tracker.activeEditors.Length; i++)  
        {  
            //这里1就是展开,0就是合起来  
            tracker.SetVisible(i, 0);  
        }  
    }  
    #endregion  
    #region ===方法===  
    #endregion  
}  

猜你喜欢

转载自blog.csdn.net/qq_40985921/article/details/89386714