1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public static class ToolsHelper
{
static FieldInfo s_Hidden;
static ToolsHelper()
{
Type type = typeof(Tools);
s_Hidden = type.GetField("s_Hidden", BindingFlags.NonPublic | BindingFlags.Static);
}
// hide default handles
public static bool Hidden
{
get
{
return ((bool)s_Hidden.GetValue(null));
}
set
{
s_Hidden.SetValue(null, value);
}
}
}
public static class EditorGUIHelper
{
#region methods
delegate void DrawPropertiesExcludingDelegate(SerializedObject obj, params string[] propertyToExclude);
static DrawPropertiesExcludingDelegate DrawPropertiesExcluding;
#endregion
#region Styles
static GUIStyle s_EditToolButtonStyle;
#endregion
static EditorGUIHelper()
{
SetupMethods();
SetupGUIStyles();
}
static void SetupMethods()
{
DrawPropertiesExcluding = GetMethod<DrawPropertiesExcludingDelegate>(typeof(Editor), "DrawPropertiesExcluding", BindingFlags.Static | BindingFlags.NonPublic);
}
static void SetupGUIStyles()
{
s_EditToolButtonStyle = new GUIStyle("Button");
s_EditToolButtonStyle.padding = new RectOffset(0, 0, 0, 0);
s_EditToolButtonStyle.margin = new RectOffset(0, 0, 0, 0);
}
private static T GetMethod<T>(Type type, string name) where T : Delegate
{
var method = type.GetMethod(name);
T del = (T)Delegate.CreateDelegate(typeof(T), method);
return del;
}
private static T GetMethod<T>(Type type, string name, BindingFlags flag) where T : Delegate
{
var method = type.GetMethod(name, flag);
T del = (T)Delegate.CreateDelegate(typeof(T), method);
return del;
}
// 绘制默认inspector但不显示script
public static bool DrawDefaultInspectorWithoutScriptField(this Editor Inspector)
{
EditorGUI.BeginChangeCheck();
Inspector.serializedObject.Update();
SerializedProperty Iterator = Inspector.serializedObject.GetIterator();
Iterator.NextVisible(true);
while (Iterator.NextVisible(false))
{
EditorGUILayout.PropertyField(Iterator, true);
}
Inspector.serializedObject.ApplyModifiedProperties();
return (EditorGUI.EndChangeCheck());
}
// 绘制默认inspector,但是不显示field
public static void DrawDefaultInspectorWithoutField(SerializedObject obj, string field)
{
EditorGUI.BeginChangeCheck();
DrawPropertiesExcluding(obj, field);
if (EditorGUI.EndChangeCheck())
obj.ApplyModifiedProperties();
}
// 控制tools开启的toggle
public static bool DrawToolsToggle(this Editor caller, string label, GUIContent icon, bool toggle)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Rect position = new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, 33f, 20f);
GUIContent content = new GUIContent(label);
Vector2 vector = GUI.skin.label.CalcSize(content);
Rect position2 = new Rect(controlRect.xMin, controlRect.yMin + (controlRect.height - vector.y) * 0.5f, vector.x, controlRect.height);
int instanceID = caller.GetInstanceID();
GUI.Label(position2, label);
toggle = GUI.Toggle(position, toggle, icon, s_EditToolButtonStyle);
return toggle;
}
// 控制tools开启的toggle
public static bool DrawToolsToggle(this Editor caller, string label, bool toggle)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Rect position = new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, 33f, 20f);
GUIContent content = new GUIContent(label);
Vector2 vector = GUI.skin.label.CalcSize(content);
Rect position2 = new Rect(controlRect.xMin, controlRect.yMin + (controlRect.height - vector.y) * 0.5f, vector.x, controlRect.height);
int instanceID = caller.GetInstanceID();
GUI.Label(position2, label);
toggle = GUI.Toggle(position, toggle, "");
return toggle;
}
// label content
public static void LabelField (string label, string content)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Vector2 vector = GUI.skin.label.CalcSize(new GUIContent(label));
EditorGUI.LabelField(new Rect(controlRect.xMin, controlRect.yMin, vector.x, 20f), label);
vector = GUI.skin.label.CalcSize(new GUIContent(content));
EditorGUI.LabelField(new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, vector.x, 20f), content);
}
// 靠右的label
public static void LabelFieldRight(string content)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Vector2 vector = GUI.skin.label.CalcSize(new GUIContent(content));
EditorGUI.LabelField(new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, vector.x, 20f), content);
}
public static bool Button(string label, string content, int width)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Vector2 vector = GUI.skin.label.CalcSize(new GUIContent(label));
EditorGUI.LabelField(new Rect(controlRect.xMin, controlRect.yMin, vector.x, 20f), label);
return GUI.Button(new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, width, 20f), content);
}
// label button tip
public static bool Button(string label, string content, int width, string tip)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Vector2 vector = GUI.skin.label.CalcSize(new GUIContent(label));
EditorGUI.LabelField(new Rect(controlRect.xMin, controlRect.yMin, vector.x, 20f), label);
bool clicked = GUI.Button(new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, width, 20f), content);
EditorGUI.LabelField(new Rect(controlRect.xMin + EditorGUIUtility.labelWidth + width + 5, controlRect.yMin, vector.x, 20f), tip);
return clicked;
}
// 按钮是图形而不是对勾的toggle
public static bool ToggleButton(string label, bool value, GUIContent button)
{
Rect controlRect = EditorGUILayout.GetControlRect(true, 20f, new GUILayoutOption[0]);
Rect position = new Rect(controlRect.xMin + EditorGUIUtility.labelWidth, controlRect.yMin, 33f, 20f);
GUIContent content = new GUIContent(label);
Vector2 vector = GUI.skin.label.CalcSize(content);
Rect position2 = new Rect(controlRect.xMin, controlRect.yMin + (controlRect.height - vector.y) * 0.5f, vector.x, controlRect.height);
GUI.Label(position2, label);
value = GUI.Toggle(position, value, button, s_EditToolButtonStyle);
return value;
}
}
|