-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSelectMenu.cs
More file actions
170 lines (147 loc) · 4.97 KB
/
SelectMenu.cs
File metadata and controls
170 lines (147 loc) · 4.97 KB
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
#if true
[InitializeOnLoad]
public class SelectMenu
{
static GenericMenu menu = new GenericMenu();
static SelectMenu()
{
SceneView.onSceneGUIDelegate -= Update;
SceneView.onSceneGUIDelegate += Update;
}
public static void Update(SceneView scene)
{
if (Event.current.control == true && Event.current.type == EventType.MouseDown && Event.current.button == 1)
{
AddMenu();
menu.ShowAsContext();
}
}
static void AddMenu()
{
menu = new GenericMenu();
if (Selection.gameObjects.Length > 0)
{
var root = Selection.activeTransform;
// Show all children
AddSelectMenu(root);
// Merge Collider
AddMergeCollider(root);
AddMergeBoundsCollider(root);
}
else
{
AddTransform(" ", false, null);
}
}
public static void AddMergeCollider(Transform root)
{
menu.AddItem(new GUIContent("Add Collider/Merge Collider"), false, MergeCollider, root);
}
public static void AddMergeBoundsCollider(Transform root)
{
menu.AddItem(new GUIContent("Add Collider/Merge Bounds"), false, MergeBound, root);
}
#region Add Collider
public static void MergeCollider(object obj)
{
var rootTrans = obj as Transform;
Collider[] allCollider = rootTrans.GetComponentsInChildren<Collider>();
if (allCollider.Length == 0)
{
return;
}
Transform parent = rootTrans.parent;
Vector3 position = rootTrans.localPosition;
Vector3 scale = rootTrans.localScale;
Quaternion rotaion = rootTrans.localRotation;
rootTrans.parent = null;
rootTrans.localRotation = Quaternion.Euler(Vector3.zero);
rootTrans.localScale = Vector3.one;
rootTrans.localPosition = Vector3.zero;
Bounds mergeBound = allCollider[0].bounds;
foreach (Collider collider in allCollider)
{
mergeBound.Encapsulate(collider.bounds);
}
rootTrans.parent = parent;
rootTrans.localPosition = position;
rootTrans.localRotation = rotaion;
rootTrans.localScale = scale;
foreach (Collider collider in allCollider)
{
Undo.DestroyObjectImmediate(collider);
}
BoxCollider mergeCollider = Undo.AddComponent<BoxCollider>(rootTrans.gameObject);
mergeCollider.center = mergeBound.center;
mergeCollider.size = mergeBound.size;
}
public static void MergeBound(object obj)
{
Transform rootTrans = obj as Transform;
Renderer[] allRenderer = rootTrans.GetComponentsInChildren<Renderer>();
if (allRenderer.Length == 0)
{
return;
}
Transform parent = rootTrans.parent;
Vector3 position = rootTrans.localPosition;
Vector3 scale = rootTrans.localScale;
Quaternion rotaion = rootTrans.localRotation;
rootTrans.parent = null;
rootTrans.localRotation = Quaternion.Euler(Vector3.zero);
rootTrans.localScale = Vector3.one;
rootTrans.localPosition = Vector3.zero;
Bounds mergeBound = allRenderer[0].bounds;
foreach (var render in allRenderer)
{
mergeBound.Encapsulate(render.bounds);
}
rootTrans.parent = parent;
rootTrans.localPosition = position;
rootTrans.localRotation = rotaion;
rootTrans.localScale = scale;
BoxCollider mergeCollider = Undo.AddComponent<BoxCollider>(rootTrans.gameObject);
mergeCollider.center = mergeBound.center;
mergeCollider.size = mergeBound.size;
}
#endregion
#region AddSelectMenu
static void AddSelectMenu(Transform obj)
{
AddWithChild(obj, "Select/");
menu.AddSeparator("Select/");
while (obj.parent != null)
{
obj = obj.parent;
AddWithChild(obj, "Select/");
}
AddWithChild(obj, "Select/");
}
static void AddWithChild(Transform obj, string pathPrefix)
{
AddTransform(pathPrefix + obj.name, false, obj);
int childNum = obj.transform.childCount;
if (childNum > 0)
{
for (int i = 0; i < childNum; ++i)
{
AddWithChild(obj.GetChild(i), pathPrefix + obj.name + "/");
}
menu.AddSeparator(pathPrefix);
}
}
static void AddTransform(string path, bool active, Transform obj)
{
menu.AddItem(new GUIContent(path), active, SelectObj, obj);
}
private static void SelectObj(object obj)
{
Selection.activeTransform = obj as Transform;
}
#endregion
}
#endif