private void ShowObject(UIElementTreeItem item) { GUILayout.BeginVertical(); { GUILayout.BeginHorizontal(); { GUILayout.Space(item.Depth * 20 + 5); item.IsOpen = Foldout(item, item.IsOpen); } GUILayout.EndHorizontal(); if (item.IsOpen) { if (item.childs != null && item.childs.Count > 0) { for (int i = 0; i < item.childs.Count; i++) { if (trees.ContainsKey(item.childs[i])) { UIElementTreeItem child = trees[item.childs[i]]; if (child != null) { ShowObject(child); } } } } } } GUILayout.EndVertical(); }
/// <summary> /// 自定义折叠页 /// 如果当前操作的组件没有子对象,则折叠功能取消,点击后相应选中或未选中状态 /// </summary> /// <param name="item"> 操作的对象 </param> /// <param name="display"> 是否折叠 </param> /// <returns></returns> private bool Foldout(UIElementTreeItem item, bool display) { bool isFoldout = item.childs != null && item.childs.Count > 0; ///Box样式 GUIStyle style = new GUIStyle("ShurikenModuleTitle"); style.font = new GUIStyle(EditorStyles.label).font; style.border = new RectOffset(15, 7, 4, 4); style.fixedHeight = 22; style.contentOffset = new Vector2(isFoldout ? 35f : 20f, -2f); ///绘制box Rect rect = GUILayoutUtility.GetRect(16f, 22f, style); GUI.Box(rect, item.Name, style); if (isFoldout) { ///每一项是否能显示的Toggle Rect selectedRect = new Rect(rect.x + 18f, rect.y, 13f, 13f); item.IsGenerate = GUI.Toggle(selectedRect, item.IsGenerate, ""); Event e = Event.current; Rect toggleRect = new Rect(rect.x + 4f, rect.y + 2f, 13f, 13f); if (e.type == EventType.Repaint) { EditorStyles.foldout.Draw(toggleRect, false, false, display, false); } if (e.type == EventType.MouseDown && rect.Contains(e.mousePosition)) { display = !display; e.Use(); } } else { Event e = Event.current; Rect toggleRect = new Rect(rect.x + 4f, rect.y, 13f, 13f); if (e.type == EventType.Repaint) { EditorStyles.toggle.Draw(toggleRect, false, false, item.IsGenerate, false); } if (e.type == EventType.MouseDown && rect.Contains(e.mousePosition)) { item.IsGenerate = !item.IsGenerate; e.Use(); } } return(display); }
/// <summary> /// 获取选择的View根节点列表 /// </summary> private void GetTreeList() { OptionView = Selection.activeTransform; if (OptionView == null) { return; } if (trees == null || trees.Count <= 0) { trees = new Dictionary <Transform, UIElementTreeItem>(); RectTransform[] rts = OptionView.GetComponentsInChildren <RectTransform>(); foreach (RectTransform rt in rts) { UIElementTreeItem item = new UIElementTreeItem(); item.gameObject = rt.gameObject; item.transform = rt.transform; item.Name = item.gameObject.name; item.Depth = 0; if (item.transform != OptionView) { item.parent = item.transform.parent; } if (item.parent != null) { Transform parent = item.transform; while (parent != OptionView) { item.Depth++; parent = parent.parent; } } if (item.transform.childCount > 0) { item.childs = new List <Transform>(); for (int i = 0; i < item.transform.childCount; i++) { item.childs.Add(item.transform.GetChild(i)); } } item.IsOpen = true; trees.Add(item.transform, item); } } }
private void DrawLeft() { EditorGUILayout.BeginVertical("box", GUILayout.Width(ListWidth)); { GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); { if (GUILayout.Button("All", GUILayout.Width(40))) { AllElementUnifyOption(true); } if (GUILayout.Button("None", GUILayout.Width(40))) { AllElementUnifyOption(false); } if (GUILayout.Button("Generate")) { GenerateInfo(GenerateTransform); } GenerateTransform = GUILayout.Toggle(GenerateTransform, "GT", GUILayout.Width(40)); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); treeScroll = EditorGUILayout.BeginScrollView(treeScroll, GUILayout.Width(ListWidth)); { if (OptionView != null) { UIElementTreeItem item = trees[OptionView]; if (item != null) { ShowObject(item); } } } EditorGUILayout.EndScrollView(); } EditorGUILayout.EndVertical(); }