// Recursively walks the object hierarchy and uses the view model information // inside the PrefabInfo object to show foldouts (not EditorGUI.Foldout but // our own that works better for our needs). void displayObject(GameObject obj, int depth, ObjectView parentView) { float buttonWidth = 20.0f; ObjectView view = null; PrefabInfo info = prefabSet.currentInfo; view = info.GetView(obj, false); views.Add(view); view.parent = parentView; bool viewSelected = info.currentID == view.localID; GUIStyle selectedStyle = viewSelected ? selectedObject : unselectedObject; if (obj.transform.childCount > 0) { Rect r = EditorGUILayout.BeginHorizontal(selectedStyle); GUILayout.Space(depth * 10); //indent GUIStyle arrowStyle = view.isOpen ? foldoutOpen : foldoutClosed; bool arrowClicked = GUILayout.Button(GUIContent.none, arrowStyle, GUILayout.Width(buttonWidth)); GUILayout.Label(obj.name); EditorGUILayout.EndHorizontal(); if (mouseEvent != null && r.Contains(mouseEvent.mousePosition) && mouseEvent.type == EventType.MouseUp) { Selection.activeObject = obj; info.currentID = view.localID; Repaint(); } if (mouseEvent != null && r.Contains(mouseEvent.mousePosition) && mouseEvent.type == EventType.MouseDown) { dragObject = obj; Repaint(); } if (arrowClicked) { view.isOpen = !view.isOpen; } if (view.isOpen) { //draw another one. foreach (Transform child in obj.transform) { displayObject(child.gameObject, depth + 1, view); } } } else { Rect r = EditorGUILayout.BeginHorizontal(selectedStyle); GUILayout.Space((depth * 10) + buttonWidth); //indent GUILayout.Label(obj.name); EditorGUILayout.EndHorizontal(); if (mouseEvent != null && r.Contains(mouseEvent.mousePosition)) { Selection.activeObject = obj; info.currentID = view.localID; Repaint(); } } }