转自 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;
/// <summary>
/// 描述:全部 展开/收起 Inspector面板的所有组件、
/// author:
/// todo 还可以深度定制,添加两个按钮切换
/// </summary>
//[CustomEditor(typeof(Transform))]
public class InspectorManagerEditor : Editor
{
#region ===字段===
#endregion
#region ===Unity事件=== 快捷键: Ctrl + Shift + M /Ctrl + Shift + Q 实现
// 显示两个可以点击的Button
//[MenuItem("MyTools/InspectorManager/全部展开组件... %#&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/全部收起组件... %#&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
}