コード例 #1
0
        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);
        }
コード例 #2
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);
         }
     }
 }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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 生成结束");
        }
コード例 #5
0
 //初始化
 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);
         }
     }
 }
コード例 #6
0
        /// <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);
                }
            }
        }
コード例 #7
0
        /// <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());
        }
コード例 #8
0
        /// <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);
            }
        }