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(); * } */ }