public bool GetAllTreeItemData(out List <TreeViewItem> items) { items = new List <TreeViewItem>(); if (!System.IO.File.Exists(jsonDataPath)) { return(false); } string json = System.IO.File.ReadAllText(jsonDataPath, System.Text.Encoding.UTF8); ListTreeItemDatas listTree = ListTreeItemDatas.FormJson(json); foreach (var item in listTree.ItemTreeList) { UITreeViewItem uiItem = new UITreeViewItem(); uiItem.id = item.id; uiItem.depth = item.depth; uiItem.displayName = item.displayname; uiItem.gameObject = Helper.FindGameObjectWithID(item.id); uiItem.isVariable = item.isVariable; uiItem.isProperty = item.isProperty; uiItem.isUseEvent = item.isUseEvent; uiItem.isExpand = item.isExpand; items.Add(uiItem); } return(items.Count > 0); }
/// <summary> /// 将子对象添加到TreeView /// </summary> /// <param name="rootTrans"></param> /// <param name="depth"></param> /// <param name="allItems"></param> private void BuildChildItemRecursive(Transform rootTrans, int depth, List <TreeViewItem> allItems) { if (rootTrans.childCount > 0) { depth++; foreach (Transform itemTrans in rootTrans) { var item = new UITreeViewItem { id = itemTrans.GetInstanceID(), depth = depth, displayName = itemTrans.name, gameObject = itemTrans.gameObject }; //item.icon = EditorGUIUtility.ObjectContent(null, Helper.GetType(itemTrans.gameObject)).image as Texture2D; //有些显示不出来 allItems.Add(item); BuildChildItemRecursive(itemTrans, depth, allItems); } } }
/// <summary> /// 绑定数据 /// </summary> /// <returns></returns> protected override TreeViewItem BuildRoot() { if (Selection.activeGameObject == null) { OnNullSelete?.Invoke(); TreeViewItem treeRoot0 = new TreeViewItem(0, -1, "Root"); SetupParentsAndChildrenFromDepths(treeRoot0, new List <TreeViewItem>() { new TreeViewItem(100, 0, "请选择一个对象") }); return(treeRoot0); } //当前选中的 seleteTrans = Selection.activeGameObject.transform; //生命一个根目录 var treeRoot = new UITreeViewItem { id = 0, depth = -1, displayName = "Root" }; allItems = new List <TreeViewItem>(); //判断原来有么有数据 List <TreeViewItem> tempitems; if (uitreeViewState.GetAllTreeItemData(out tempitems)) { //Debug.Log("原来有数据 从json中加载数据"); allItems.AddRange(tempitems); isFirstInit = false; } else { isFirstInit = true; int depth = 0; var root = new UITreeViewItem { id = seleteTrans.GetInstanceID(), depth = depth, displayName = seleteTrans.name, gameObject = seleteTrans.gameObject }; allItems.Add(root); //添加所有子物体 BuildChildItemRecursive(seleteTrans, depth, allItems); } SetupParentsAndChildrenFromDepths(treeRoot, allItems); return(treeRoot); }
/// <summary> /// 将所有的treeitem数据保存 /// </summary> /// <param name="items"></param> public void SaveAllTreeItemData(UITreeview uiTreeview) { List <TreeViewItem> items = uiTreeview.allItems; ListTreeItemDatas listTreeItemDatas = new ListTreeItemDatas(); for (int i = 0; i < items.Count; i++) { UITreeViewItem item = items[i] as UITreeViewItem; if (item != null) { listTreeItemDatas.ItemTreeList.Add(new TreeItemData(item.id, item.depth, item.displayName, item.isVariable, item.isProperty, item.isUseEvent, uiTreeview.IsExpanded(item.id))); } } System.IO.File.WriteAllText(jsonDataPath, listTreeItemDatas.ToJson(), System.Text.Encoding.UTF8); //Debug.Log("json 生成结束"); }
//初始化 public UITreeview(TreeViewState treeViewState) : base(treeViewState) { uitreeViewState = treeViewState as UITreeViewState; Reload(); rowHeight = 20f; //行高 if (isFirstInit) { ExpandAll(); } else { SetExpanded(0, true); foreach (var item in allItems) { UITreeViewItem uitreeitem = (item as UITreeViewItem); SetExpanded(uitreeitem.id, uitreeitem.isExpand); } } }
/// <summary> /// 设置子物体状态 /// </summary> /// <param name="item"></param> /// <param name="isCheck"></param> private void CheckChildRecursive(UITreeViewItem item, bool isOn, bool isVariable = false, bool isProperty = false, bool isEvent = false) { if (isVariable) { item.isVariable = isOn; } else if (isProperty) { item.isProperty = isOn; } else if (isEvent) { item.isUseEvent = isOn; } if (item.hasChildren) { foreach (var itemChild in item.children) { UITreeViewItem uitreeitem = (itemChild as UITreeViewItem); if (isVariable) { uitreeitem.isVariable = isOn; } else if (isProperty) { uitreeitem.isProperty = isOn; } else if (isEvent) { uitreeitem.isUseEvent = isOn; } CheckChildRecursive(uitreeitem, isOn, isVariable, isProperty, isEvent); } } }
/// <summary> /// 生成代码 /// </summary> /// <param name="uitreeView"></param> /// <returns></returns> public static string StartScriptGenerate(UITreeview uitreeView) { uiTreeview = uitreeView; StringBuilder sb = new StringBuilder(); sb.Append(Str_Using); sb.Append(Str_Class); sb.Append("\n{\n"); List <VariableNameData> listVariableName = new List <VariableNameData>(); //变量名 List <PathData> listVariablePath = new List <PathData>(); //变量名路径 List <VariableNameData> listProperty = new List <VariableNameData>(); //属性 List <VariableNameData> listEvent = new List <VariableNameData>(); //事件 foreach (var item in uiTreeview.allItems) { UITreeViewItem uitreeitem = item as UITreeViewItem; if (uitreeitem.isVariable) { //类型 Image Button //Type type = Helper.GetType(Helper.IDToGameObject(uitreeitem.id)); string type = uitreeitem.CurrentGoComponents[uitreeitem.CurrentSeleteComponentIndex]; string disName = "m_" + uitreeitem.displayName.Replace(" ", "_"); //添加变量 listVariableName.Add(new VariableNameData(type, disName)); //添加查找路径 listVariablePath.Add(new PathData(disName, GetTreeItemFullPath(uitreeitem).ToString(), type)); if (uitreeitem.isProperty) { listProperty.Add(new VariableNameData(type, disName)); } if (uitreeitem.isUseEvent) { if (hashUIEventType.Contains(type)) { listEvent.Add(new VariableNameData(type, disName)); } } } } #region 添加变量 foreach (var item in listVariableName) { sb.Append($"\t[SerializeField] {item.type} {item.goName};\r\n"); } #endregion sb.Append("\r\n"); #region 添加属性 foreach (var item in listProperty) { sb.Append($"\tpublic {item.type} {item.goName.Remove(0, 2)} {{get {{ return {item.goName};}} }} \r\n"); } #endregion #region 添加事件 if (listEvent.Count > 0) { sb.Append("\r\n"); sb.Append("\tprivate void Start()\n\t{\n"); //start 方法 List <string> listMethodName = new List <string>(); foreach (var item in listEvent) { sb.Append($"\t\t{item.goName}."); if (item.type == nameof(Button)) { string methodName = $"{item.goName}_OnClick"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onClick.AddListener({methodName});\n"); listMethodName.Add(methodName + "()"); } else if (item.type == "ButtonPlus") { string methodName = $"{item.goName}_OnClick"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onClick.AddListener({methodName});\n"); listMethodName.Add(methodName + "()"); } else if (item.type == nameof(Toggle)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(bool isOn)"); } else if (item.type == nameof(InputField)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(string arg)"); } else if (item.type == nameof(Slider)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(float value)"); } else if (item.type == nameof(Dropdown)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(int index)"); } else if (item.type == nameof(Scrollbar)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(float value)"); } else if (item.type == nameof(ScrollRect)) { string methodName = $"{item.goName}_OnValueChanged"; methodName = methodName.Remove(0, 2); //移除m_ sb.Append($"onValueChanged.AddListener({methodName});\n"); listMethodName.Add(methodName + "(Vector2 detal)"); } } sb.Append("\t}\n"); //添加方法 foreach (var method in listMethodName) { sb.Append($"\tprivate void {method}\n"); sb.Append("\t{\n\n\t}\n"); } } #endregion #region 添加Reset方法 查询路径 sb.Append("\r\n\r\n\r\n"); sb.Append("\t#region 用于寻找控件,当控件丢失,点击脚本齿轮->Reset菜单可恢复,也可重新编写下面的路径代码\r\n"); sb.Append("#if UNITY_EDITOR\n\tprivate void Reset()\n"); sb.Append("\t{\n"); //添加寻找代码 for (int i = 0; i < listVariablePath.Count; i++) { string needFind = string.IsNullOrEmpty(listVariablePath[i].path) ? string.Empty : $"transform.Find(\"{listVariablePath[i].path}\")."; sb.Append($"\t\t{listVariablePath[i].variablename}={needFind}GetComponent<{listVariablePath[i].typename}>();\r\n"); } sb.Append("\t}\n"); sb.Append("#endif\n"); sb.Append("\t#endregion\n"); #endregion sb.Append("}"); return(sb.ToString()); }
/// <summary> /// 自定义UI /// </summary> /// <param name="args"></param> protected override void RowGUI(RowGUIArgs args) { if (Selection.activeGameObject != null) { Event evt = Event.current; UITreeViewItem item = args.item as UITreeViewItem; if (item == null) { return; } #region 变量框 Rect togVariable = args.rowRect; togVariable.x += GetContentIndent(item); togVariable.width = 16f; Rect togLable = togVariable; togLable.x += 16; togLable.width = 28; GUI.Label(togLable, "变量", EditorStyles.whiteLabel); EditorGUI.BeginChangeCheck(); bool isTogVariable = EditorGUI.Toggle(togVariable, item.isVariable); if (EditorGUI.EndChangeCheck()) { item.isVariable = isTogVariable; if (linkPartentChild) { CheckChildRecursive(item, isTogVariable, isVariable: true); } } #endregion #region 属性框 Rect togPropetty = togLable; togPropetty.x += 35; togPropetty.width = 16f; Rect togLablePropetty = togPropetty; togLablePropetty.x += 16; togLablePropetty.width = 28; GUI.color = Color.cyan; GUI.Label(togLablePropetty, "属性", EditorStyles.label); GUI.color = Color.white; EditorGUI.BeginChangeCheck(); bool isTogPropetty = EditorGUI.Toggle(togPropetty, item.isProperty); if (EditorGUI.EndChangeCheck()) { item.isProperty = isTogPropetty; if (linkPartentChild) { CheckChildRecursive(item, isTogPropetty, isProperty: true); } } #endregion #region 事件框 Rect togEvent = togLablePropetty; togEvent.x += 35; togEvent.width = 16f; Rect togLableTogEvent = togEvent; togLableTogEvent.x += 16; togLableTogEvent.width = 28; GUI.color = Color.yellow; GUI.Label(togLableTogEvent, "事件", EditorStyles.whiteLabel); GUI.color = Color.white; EditorGUI.BeginChangeCheck(); bool isTogEvent = EditorGUI.Toggle(togEvent, item.isUseEvent); if (EditorGUI.EndChangeCheck()) { item.isUseEvent = isTogEvent; if (linkPartentChild) { CheckChildRecursive(item, isTogEvent, isEvent: true); } } #endregion #region 枚举框 Rect enumRect = togLableTogEvent; enumRect.x += 42; enumRect.width = 100; //ScaleMode scaleMode=ScaleMode.ScaleAndCrop; item.CurrentSeleteComponentIndex = EditorGUI.Popup(enumRect, item.CurrentSeleteComponentIndex, item.CurrentGoComponents); #endregion //if (evt.type == EventType.MouseDown && togVariable.Contains(evt.mousePosition)) // SelectionClick(item, false); args.rowRect = new Rect(new Vector2(args.rowRect.x + 252, args.rowRect.y), args.rowRect.size); //图标和标签之前的间距的值 extraSpaceBeforeIconAndLabel = 36; //绘制图标 Rect gizmoRect = args.rowRect; gizmoRect.x += GetContentIndent(item) + 16; gizmoRect.width = 16f; gizmoRect.height = 16f; //绘制图标 GUI.DrawTexture(gizmoRect, new GUIContent(EditorGUIUtility.ObjectContent(null, Helper.GetTypeWithName(item.CurrentSeleteComponentName))).image); base.RowGUI(args); } else { base.RowGUI(args); } }