示例#1
0
    private void OnGUI()
    {
        if (uiFocusPath == null)
        {
            return;
        }
        //提取所有焦点
        uiFocusToLocaionDic = uiFocusPath.NewUIFocusArray.Where(temp => temp != null).ToDictionary(temp => temp, temp => temp.transform.position);
        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("缩放比例:", GUILayout.Width(50));
        scale = GUILayout.HorizontalSlider(scale, 0.2f, 5f, GUILayout.Width(100));
        EditorGUILayout.LabelField("显示全部", GUILayout.Width(50));
        showAll = EditorGUILayout.Toggle(showAll, GUILayout.Width(15));
        EditorGUILayout.LabelField("点击选择对象", GUILayout.Width(75));
        clickButtonToSelect = EditorGUILayout.Toggle(clickButtonToSelect, GUILayout.Width(15));
        EditorGUILayout.EndHorizontal();
        if (uiFocusToLocaionDic.Count <= 0)
        {
            EditorGUILayout.EndVertical();
            return;
        }
        //计算出一个范围
        float   minX       = uiFocusToLocaionDic.Min(temp => temp.Value.x) - 30;
        float   minY       = uiFocusToLocaionDic.Min(temp => temp.Value.y) - 30;
        float   maxX       = uiFocusToLocaionDic.Max(temp => temp.Value.x) + 30;
        float   maxY       = uiFocusToLocaionDic.Max(temp => temp.Value.y) + 30;
        Vector2 baseOffset = new Vector2(minX, minY);                                       //基础的偏差值
        Vector2 baseSize   = new Vector2(maxX - minX, maxY - minY);                         //基础的大小
        Rect    baseRect   = new Rect(baseOffset, baseSize);                                //基础的位置
        Dictionary <UIFocus, Rect> uiFocusToShowRectDic = new Dictionary <UIFocus, Rect>(); //本次运行时的显示区域

        scroll = GUI.BeginScrollView(new Rect(0, 40, position.width, position.height - 40), scroll, new Rect(0, 0, baseRect.width * scale, baseRect.height * scale));
        foreach (KeyValuePair <UIFocus, Vector3> item in uiFocusToLocaionDic)//遍历绘制
        {
            Vector2 nowPos = item.Value;
            nowPos   = nowPos - baseOffset;
            nowPos.y = baseSize.y - nowPos.y;
            nowPos  *= scale;
            Rect     tempRect    = new Rect(nowPos.x, nowPos.y, 70, 15);
            GUIStyle buttonStyle = buttonNotSelectStyle;
            if (selectUIFcous == item.Key)
            {
                buttonStyle = buttonSelectStyle;
            }
            if (GUI.Button(tempRect, item.Key.name, buttonStyle))
            {
                selectUIFcous = item.Key;
                if (clickButtonToSelect)
                {
                    Selection.activeGameObject = selectUIFcous.gameObject;
                }
            }
            uiFocusToShowRectDic.Add(item.Key, new Rect(nowPos.x - scroll.x, nowPos.y + 40 - scroll.y, 70, 15));
        }
        GUI.EndScrollView();
        EditorGUILayout.EndVertical();
        Dictionary <Vector3[], UIFocus[]> lineToFocusDic = new Dictionary <Vector3[], UIFocus[]>();//线对应焦点字典
        //绘制线
        Action <Vector3, Vector3, UIFocus, UIFocus> DrawLineAction = (startVec, endVec, startFocus, endFocus) =>
        {
            Handles.color = Color.red;
            Handles.DrawLine(startVec, endVec);
            lineToFocusDic.Add(new Vector3[] { startVec, endVec }, new UIFocus[] { startFocus, endFocus });
        };

        foreach (UIFocusPath.FocusRelaship item in uiFocusPath.UIFocusArrayRelaships)
        {
            if (showAll || item.This == selectUIFcous)
            {
                if (!uiFocusToShowRectDic.ContainsKey(item.This))
                {
                    continue;
                }
                Rect thisRect = uiFocusToShowRectDic[item.This];
                if (item.Up)
                {
                    Vector3 thisVec = new Vector3(thisRect.xMin + thisRect.width / 2, thisRect.yMin);
                    if (uiFocusToShowRectDic.ContainsKey(item.Up))
                    {
                        Rect    upRect = uiFocusToShowRectDic[item.Up];
                        Vector3 target = upRect.center;
                        DrawLineAction(thisVec, target, item.This, item.Up);
                    }
                }
                if (item.Down)
                {
                    Vector3 thisVec = new Vector3(thisRect.xMin + thisRect.width / 2, thisRect.yMax);
                    if (uiFocusToShowRectDic.ContainsKey(item.Down))
                    {
                        Rect    downRect = uiFocusToShowRectDic[item.Down];
                        Vector3 target   = downRect.center;
                        DrawLineAction(thisVec, target, item.This, item.Down);
                    }
                }
                if (item.Left)
                {
                    Vector3 thisVec = new Vector3(thisRect.xMin, thisRect.yMin + thisRect.height / 2);
                    if (uiFocusToShowRectDic.ContainsKey(item.Left))
                    {
                        Rect    leftRect = uiFocusToShowRectDic[item.Left];
                        Vector3 target   = leftRect.center;
                        DrawLineAction(thisVec, target, item.This, item.Left);
                    }
                }
                if (item.Right)
                {
                    Vector3 thisVec = new Vector3(thisRect.xMax, thisRect.yMin + thisRect.height / 2);
                    if (uiFocusToShowRectDic.ContainsKey(item.Right))
                    {
                        Rect    rightRect = uiFocusToShowRectDic[item.Right];
                        Vector3 target    = rightRect.center;
                        DrawLineAction(thisVec, target, item.This, item.Right);
                    }
                }
            }
        }

        Event e = Event.current;

        //绘制选择对象的四个游标
        if (selectUIFcous)
        {
            Rect thisRect  = uiFocusToShowRectDic[selectUIFcous];
            Rect upRect    = new Rect(thisRect.xMin + thisRect.width / 2 - 5, thisRect.yMin - 10, 10, 10);
            Rect downRect  = new Rect(thisRect.xMin + thisRect.width / 2 - 5, thisRect.yMax, 10, 10);
            Rect leftRect  = new Rect(thisRect.xMin - 10, thisRect.yMin + thisRect.height / 2 - 5, 10, 10);
            Rect rightRect = new Rect(thisRect.xMax, thisRect.yMin + thisRect.height / 2 - 5, 10, 10);
            GUI.DrawTexture(upRect, relashipButtonTexture);
            GUI.DrawTexture(downRect, relashipButtonTexture);
            GUI.DrawTexture(leftRect, relashipButtonTexture);
            GUI.DrawTexture(rightRect, relashipButtonTexture);
            if (e.button == 1 && e.rawType == EventType.mouseDown)
            {
                if (upRect.Contains(e.mousePosition))
                {
                    forwardType = EnumEditorGUIFocusPathForward.Up;
                }
                else if (downRect.Contains(e.mousePosition))
                {
                    forwardType = EnumEditorGUIFocusPathForward.Down;
                }
                else if (leftRect.Contains(e.mousePosition))
                {
                    forwardType = EnumEditorGUIFocusPathForward.Left;
                }
                else if (rightRect.Contains(e.mousePosition))
                {
                    forwardType = EnumEditorGUIFocusPathForward.Right;
                }
            }
        }

        if (e.button == 1)
        {
            if (forwardType != null)
            {
                if (selectUIFcous)
                {
                    Rect thisRect  = uiFocusToShowRectDic[selectUIFcous];
                    Rect upRect    = new Rect(thisRect.xMin + thisRect.width / 2 - 5, thisRect.yMin - 10, 10, 10);
                    Rect downRect  = new Rect(thisRect.xMin + thisRect.width / 2 - 5, thisRect.yMax, 10, 10);
                    Rect leftRect  = new Rect(thisRect.xMin - 10, thisRect.yMin + thisRect.height / 2 - 5, 10, 10);
                    Rect rightRect = new Rect(thisRect.xMax, thisRect.yMin + thisRect.height / 2 - 5, 10, 10);
                    Handles.color = Color.gray;
                    switch (forwardType.Value)
                    {
                    case EnumEditorGUIFocusPathForward.Left:
                        Handles.DrawLine(leftRect.center, e.mousePosition);
                        break;

                    case EnumEditorGUIFocusPathForward.Right:
                        Handles.DrawLine(rightRect.center, e.mousePosition);
                        break;

                    case EnumEditorGUIFocusPathForward.Up:
                        Handles.DrawLine(upRect.center, e.mousePosition);
                        break;

                    case EnumEditorGUIFocusPathForward.Down:
                        Handles.DrawLine(downRect.center, e.mousePosition);
                        break;
                    }
                }
            }
        }

        if (e.button == 1 && e.rawType == EventType.mouseUp)
        {
            if (forwardType != null)
            {
                KeyValuePair <UIFocus, Rect>[] mouseUpResultArray = uiFocusToShowRectDic.Where(temp => temp.Value.Contains(e.mousePosition)).ToArray();

                KeyValuePair <UIFocus, Rect> mouseUpResult = mouseUpResultArray.FirstOrDefault();
                UIFocusPath.FocusRelaship    focusRelaship = uiFocusPath.UIFocusArrayRelaships.FirstOrDefault(temp => temp.This == selectUIFcous);
                if (focusRelaship != null)
                {
                    switch (forwardType.Value)
                    {
                    case EnumEditorGUIFocusPathForward.Left:
                        focusRelaship.Left = mouseUpResult.Key;
                        break;

                    case EnumEditorGUIFocusPathForward.Right:
                        focusRelaship.Right = mouseUpResult.Key;
                        break;

                    case EnumEditorGUIFocusPathForward.Up:
                        focusRelaship.Up = mouseUpResult.Key;
                        break;

                    case EnumEditorGUIFocusPathForward.Down:
                        focusRelaship.Down = mouseUpResult.Key;
                        break;
                    }
                }
                forwardType = null;
            }
        }
    }
    public override void OnInspectorGUI()
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("批量导入的UIFocus对象的父对象");
        parentRect = EditorGUILayout.ObjectField(parentRect, typeof(RectTransform), true) as RectTransform;
        if (parentRect != null && GUILayout.Button("批量导入") && EditorUtility.DisplayDialog("提示!", "是否导入?", "确认", "取消"))
        {
            int  count     = parentRect.childCount;
            var  uiFocuses = Enumerable.Range(0, count).Select(temp => parentRect.GetChild(temp).GetComponent <UIFocus>()).Where(temp => temp != null);
            bool add       = false;
            List <UIFocusPath.FocusRelaship> tempList = new List <UIFocusPath.FocusRelaship>(TargetObj.UIFocusArrayRelaships);
            foreach (UIFocus uiFocus in uiFocuses)
            {
                if (TargetObj.UIFocusArrayRelaships.Count(temp => temp.This == uiFocus) == 0)
                {
                    UIFocusPath.FocusRelaship temp = new UIFocusPath.FocusRelaship();
                    temp.This = uiFocus;
                    tempList.Add(temp);
                    add = true;
                }
            }
            if (add)
            {
                TargetObj.UIFocusArrayRelaships = tempList.ToArray();
            }
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("单独的UIFocus对象");
        UIFocus addTempUIFocus = EditorGUILayout.ObjectField(null, typeof(UIFocus), true) as UIFocus;

        if (addTempUIFocus != null)
        {
            if (TargetObj.UIFocusArrayRelaships.Count(temp => temp.This == addTempUIFocus) == 0)
            {
                List <UIFocusPath.FocusRelaship> tempList = new List <UIFocusPath.FocusRelaship>(TargetObj.UIFocusArrayRelaships);
                UIFocusPath.FocusRelaship        temp     = new UIFocusPath.FocusRelaship();
                temp.This = addTempUIFocus;
                tempList.Add(temp);
                TargetObj.UIFocusArrayRelaships = tempList.ToArray();
            }
        }
        EditorGUILayout.EndHorizontal();
        ////如果不加这一句,则无法保存
        //if (GUI.changed|| GUILayout.Button("保存"))
        //{
        //    EditorUtility.SetDirty(target);
        //    Undo.RecordObject(target, "UIFocusPathEditorChanged");
        //}
        if (GUILayout.Button("编辑"))
        {
            UIFocusPathEditorWindow uiFocusPathEditorWindow = EditorWindow.GetWindow <UIFocusPathEditorWindow>();
            uiFocusPathEditorWindow.Show();
        }
        EditorGUILayout.LabelField("自身|上|下|左|右");
        List <UIFocusPath.FocusRelaship> mustRemoveList = new List <UIFocusPath.FocusRelaship>();

        if (TargetObj.UIFocusArrayRelaships.Count(temp => temp == null || temp.This == null) > 0)
        {
            TargetObj.UIFocusArrayRelaships = TargetObj.UIFocusArrayRelaships.Where(temp => temp != null && temp.This != null).ToArray();
        }
        foreach (UIFocusPath.FocusRelaship focusRelaship in TargetObj.UIFocusArrayRelaships)
        {
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.ObjectField(focusRelaship.This, typeof(UIFocus), true);
            EditorGUILayout.ObjectField(focusRelaship.Up, typeof(UIFocus), true);
            EditorGUILayout.ObjectField(focusRelaship.Down, typeof(UIFocus), true);
            EditorGUILayout.ObjectField(focusRelaship.Left, typeof(UIFocus), true);
            EditorGUILayout.ObjectField(focusRelaship.Right, typeof(UIFocus), true);
            if (GUILayout.Button("X", GUILayout.Width(20)) && EditorUtility.DisplayDialog("提示", "是否移除?", "是", "否"))
            {
                mustRemoveList.Add(focusRelaship);
            }
            EditorGUILayout.EndHorizontal();
        }
        if (mustRemoveList.Count > 0)
        {
            TargetObj.UIFocusArrayRelaships = TargetObj.UIFocusArrayRelaships.Where(temp => !mustRemoveList.Contains(temp)).ToArray();
        }

        /*
         * UIFocus[,] lastValue = new UIFocus[TargetObj.row, TargetObj.column];
         * for (int i = 0; i < TargetObj.row; i++)
         * {
         *  for (int j = 0; j < TargetObj.column; j++)
         *  {
         *      try
         *      {
         *          lastValue[i, j] = TargetObj.UIFocuesArray[i * TargetObj.column + j];
         *      }
         *      catch { }
         *  }
         * }
         * TargetObj.row = EditorGUILayout.IntField("行", TargetObj.row);
         * TargetObj.column = EditorGUILayout.IntField("列", TargetObj.column);
         * //重设数组
         * if (TargetObj.row * TargetObj.column != TargetObj.UIFocuesArray.Length)
         * {
         *  UIFocus[] uiFocusArray = new UIFocus[TargetObj.row * TargetObj.column];
         *  for (int i = 0; i < TargetObj.row; i++)
         *  {
         *      if (lastValue.GetLength(0) > i)
         *          for (int j = 0; j < TargetObj.column; j++)
         *          {
         *              if (lastValue.GetLength(1) > j)
         *              {
         *                  uiFocusArray[i * TargetObj.column + j] = lastValue[i, j];
         *              }
         *          }
         *  }
         *  TargetObj.UIFocuesArray = uiFocusArray;
         * }
         * //绘制
         * EditorGUILayout.LabelField("网格");
         * for (int i = 0; i < TargetObj.row; i++)
         * {
         *  EditorGUILayout.BeginHorizontal();
         *  for (int j = 0; j < TargetObj.column; j++)
         *  {
         *      TargetObj.UIFocuesArray[i * TargetObj.column + j] = EditorGUILayout.ObjectField(TargetObj.UIFocuesArray[i * TargetObj.column + j], typeof(UIFocus), true) as UIFocus;
         *  }
         *  EditorGUILayout.EndHorizontal();
         * }
         */
    }