2using System.Collections;
4using System.Reflection;
8using System.Collections.Generic;
23 private GameObject hierarchyRoot;
25 private List<GameObject> savedHighlights =
new List<GameObject>();
28 private readonly List<GameObject> _openedObjects =
new List<GameObject>();
32 StartCoroutine(DelayedStart());
35 IEnumerator DelayedStart()
37 yield
return new WaitForSeconds(0.1f);
39 hierarchyRoot = GameObject.Find(
"Level Editor SceneGraph Root");
41 DisplayObjectTreeHelper(hierarchyRoot, 0, ref currentCount);
46 _openedObjects.Clear();
49 DisplayObjectTreeHelper(hierarchyRoot, 0, ref currentCount);
54 var allFind =
inspectorScrollPanel.GetComponentsInChildren<Transform>(
true).Where(x => x.name.Contains(text));
58 foreach (var item
in allFind)
60 _openedObjects.Add(item.gameObject);
62 item.gameObject.SetActive(
true);
64 var parents = item.GetComponentsInParent<Transform>(
true);
65 foreach (var o
in parents)
67 o.gameObject.SetActive(
true);
72 internal void ToggleHierarchy(GameObject panel, GameObject selectable =
null)
74 if (Input.GetKey(KeyCode.LeftControl))
76 if (savedHighlights.Contains(selectable))
87 pb_Selection.SetSelection(selectable);
89 if (_openedObjects.Contains(panel))
91 if (!savedHighlights.Contains(selectable))
95 _openedObjects.Remove(panel);
96 var childs = panel.GetComponentsInChildren<Transform>(
true);
97 foreach (var o
in childs)
99 if (o.gameObject != panel)
100 if (o.name !=
"Label Field")
101 o.gameObject.SetActive(
false);
106 _openedObjects.Add(panel);
107 var childs = panel.GetComponentsInChildren<Transform>(
true);
108 foreach (var o
in childs)
110 o.gameObject.SetActive(
true);
123 savedHighlights.Add(selection);
131 savedHighlights.Remove(selection);
138 foreach (Transform c
in p)
144 if (!c.gameObject.GetComponent<Outline>())
146 var outline = c.gameObject.AddComponent<Outline>();
147 outline.effectColor =
Color.white;
148 outline.effectDistance = Vector2.one;
150 c.gameObject.SetActive(
true);
152 var parents = c.GetComponentsInParent<Transform>(
true);
153 foreach (var o
in parents)
155 o.gameObject.SetActive(
true);
161 DestroyImmediate(c.gameObject.GetComponent<Outline>());
165 foreach (Transform cc
in c)
171 if (!cc.GetComponent<Outline>())
173 var outline = cc.gameObject.AddComponent<Outline>();
174 outline.effectColor =
Color.white;
175 outline.effectDistance =
Vector2.one;
177 if (!cc.gameObject.activeSelf)
179 cc.gameObject.SetActive(
true);
181 var parents = c.GetComponentsInParent<Transform>(
true);
182 foreach (var o
in parents)
184 o.gameObject.SetActive(
true);
189 DestroyImmediate(cc.gameObject.GetComponent<Outline>());
197 private bool DisplayObjectTreeHelper(GameObject go,
int indent, ref
int currentCount, GameObject parentPanel =
null,
198 bool closed =
false, List<GameObject> selection =
null)
205 var goName = goRo ?
string.IsNullOrEmpty(goRo.NewName) ? go.name.ToUpper() : goRo.
NewName.ToUpper() : go.name.ToUpper();
206 GameObject panel = pb_GUIUtility.CreateLabeledVerticalPanel(goName);
207 panel.GetComponent<VerticalLayoutGroup>().padding =
new RectOffset(8,4,4,4);
211 cell.empty =
Color.white;
212 cell.empty.a = 16 / 255f;
213 cell.full =
Color.white;
214 cell.full.a = 16/255f;
215 cell.ignoreColor =
false;
218 panel.transform.SetParent(parentPanel ? parentPanel.transform :
inspectorScrollPanel.transform);
219 panel.AddComponent<ClickAction>();
220 var button = panel.AddComponent<
Button>();
221 button.transition = Selectable.Transition.None;
222 if (selection !=
null && selection.Contains(go))
224 if (!panel.GetComponent<Outline>())
226 var outline = panel.AddComponent<Outline>();
227 outline.effectColor =
Color.white;
228 outline.effectDistance =
Vector2.one;
233 panel.SetActive(!closed);
235 for (var i = 0; i < go.transform.childCount; ++i)
236 DisplayObjectTreeHelper(go.transform.GetChild(i).gameObject, indent + 1, ref currentCount, panel,
237 !_openedObjects.Contains(go), selection);
241 for (var i = 0; i < go.transform.childCount; ++i)
242 if (DisplayObjectTreeHelper(go.transform.GetChild(i).gameObject, indent + 1, ref currentCount, selection: selection))
253 if (go ==
null) go = hierarchyRoot;
256 var currentCount = 0;
257 DisplayObjectTreeHelper(go, 0, ref currentCount, selection: savedHighlights);
264 StartCoroutine(DelayedRebuild());
267 IEnumerator DelayedRebuild()
269 yield
return new WaitForSeconds(0.1f);
271 yield
return new WaitForEndOfFrame();
273 var currentCount = 0;
274 if (!DisplayObjectTreeHelper(hierarchyRoot, 0, ref currentCount))
276 yield
return new WaitForSeconds(0.5f);
277 DisplayObjectTreeHelper(hierarchyRoot, 0, ref currentCount);
281 void ClearInspector()
285 pb_ObjectUtility.Destroy(go.gameObject);
300 var temp = FindObjectOfType<pb_Hierarchy>();
302 temp.ToggleHierarchy(gameObject, rs.Reference);
304 if (eventData.clickCount == 2)
312 [CustomEditor(typeof(pb_Hierarchy))]
313 public class pb_HierarchyInspector : Editor
315 public override void OnInspectorGUI ()
317 DrawDefaultInspector();
319 pb_Hierarchy myTarget = (pb_Hierarchy)target;
320 GUILayout.BeginHorizontal();
321 if (GUILayout.Button(
"Rebuild Inspector"))
323 myTarget.RebuildInspector();
325 GUILayout.EndHorizontal();
UnityEngine.UI.Button Button
Every item's cell must contain this script
void OnPointerClick(PointerEventData eventData)
void RebuildInspector(GameObject go)
void HighlightSelected(GameObject selection)
void RemoveSelected(GameObject selection)
void ToggleInspector(bool show)
GameObject inspectorScrollPanel
static void Focus(Vector3 target)
static void RemoveFromSelection(GameObject go)
static void AddToSelection(GameObject go)