Beispiel #1
0
        private void OnGUI()
        {
            //激活检测
            if (!Active)
            {
                GUILayout.Label("地图没打开,地图编辑器未激活!");
                if (GUILayout.Button("打开地图"))
                {
                    EditorSceneManager.OpenScene("Assets/Scenes/In Game.unity");
                }
                return;
            }

            if (!selectionChecked)
            {
                CheckSelection();
            }

            //场景参数计算
            radius = Mathf.Min(EditorGUIUtility.currentViewWidth - Prefs.sideWidth, position.height) / 2 - Prefs.edge;
            center = new Vector2(radius + Prefs.edge + Prefs.sideWidth, radius + Prefs.edge);

            Vector3 cameraDir = SceneView.lastActiveSceneView == null ? Vector3.back : SceneView.lastActiveSceneView.camera.transform.forward;
            Vector2 start     = Vector3.right;

            cameraRotation = Quaternion.LookRotation(Vector3.forward, new Vector3(cameraDir.x, cameraDir.z, 0));
            Vector2 mid = Quaternion.Euler(0, 0, -MapSystem.AnglePerGroup / 2) * Vector2.right * radius / 2;

            //事件交互
            switch (Event.current.type)
            {
            case EventType.Layout:
            case EventType.Repaint:
            {
                //画底部圆盘
                for (int i = 0; i < 3; i++)
                {
                    float angle = MapSystem.GetAngle(new Vector3(mid.x, 0, -mid.y));
                    int   index = (int)(angle / MapSystem.AnglePerGroup);

                    Color color;
                    if (GroupList[index] == null)
                    {
                        color = Color.gray;
                    }
                    else
                    {
                        color = Prefs.circleGradient.Evaluate(angle / MapSystem.MaxAngle);
                    }

                    float alpha = 1 - Prefs.arcAlphaCurve.Evaluate(Mathf.Abs(MapSystem.SubSigned(MapSystem.currentAngle, angle)));
                    color.a       = Mathf.Lerp(0, 1, alpha);
                    Handles.color = color;
                    Handles.DrawSolidArc((Vector3)center + cameraRotation * mid * Mathf.Lerp(Prefs.arcCenterOffsetRateMin, Prefs.arcCenterOffsetRateMax, alpha), Vector3.back, cameraRotation * start, 120, (radius + Mathf.Lerp(-10, 25, (viewScale.value - Prefs.minScale) / (Prefs.maxScale - Prefs.minScale))) * Mathf.Lerp(Prefs.arcMinRadiusRate, 1, alpha));
                    if (GroupList[index] == null)
                    {
                        Handles.Label((Vector3)center + cameraRotation * mid * Mathf.Lerp(1, Prefs.groupNumDistance, alpha), index.ToString(), Prefs.groupNumStyle);
                    }
                    else
                    {
                        Handles.Label((Vector3)center + cameraRotation * mid * Mathf.Lerp(1, Prefs.groupNumDistance, alpha), index.ToString() + " " + GroupList[index].groupName + (GroupList[index].dirty ? "*" : ""), Prefs.groupNumStyle);
                    }
                    start = rot * start;
                    mid   = rot * mid;
                }
                Handles.color = Color.white;

                //中心圆盘
                Handles.color = Prefs.centerDiscColor;
                {
                    Handles.DrawSolidDisc(center, Vector3.back, Prefs.centerDiscRadius);
                    Handles.Label(center - Prefs.centerDiscStyle.CalcSize(new GUIContent(MapSystem.CurrentCircle.ToString())) / 2f, MapSystem.CurrentCircle.ToString(), Prefs.centerDiscStyle);
                }
                Handles.color = Color.white;


                //画侧面刻度
                Handles.color = Prefs.sideColor;
                {
                    Vector2 yRange = new Vector2(Prefs.edge + (1 - Prefs.sideLineLengthRate) * radius, Prefs.edge + (1 + Prefs.sideLineLengthRate) * radius);
                    Vector2 xRange = new Vector2(Prefs.sideWidth - Prefs.sideXOffset + (Prefs.sideFlip ? -Prefs.sideMarkWidth : Prefs.sideMarkWidth), Prefs.sideWidth - Prefs.sideXOffset);
                    Handles.DrawAAPolyLine(
                        Prefs.sideLineWidth,
                        new Vector2(xRange.x, yRange.x),
                        new Vector2(xRange.y, yRange.x),
                        new Vector2(xRange.y, yRange.y),
                        new Vector2(xRange.x, yRange.y)
                        );

                    xRange.x = Prefs.sideWidth - Prefs.sideXOffset + (Prefs.sideFlip ? -Prefs.sideMarkWidth * Prefs.sideLineLengthRate : Prefs.sideMarkWidth * Prefs.sideLineLengthRate);
                    for (int i = 1; i < Prefs.sideMarkNum; i++)
                    {
                        float yPos = Mathf.Lerp(yRange.x, yRange.y, (float)i / (float)Prefs.sideMarkNum);
                        Handles.DrawLine(new Vector2(xRange.x, yPos), new Vector2(xRange.y, yPos));
                    }

                    float arrowXOffset = (Prefs.sideFlip ? -1 : 1) * Prefs.sideArrowSize * Mathf.Cos(Prefs.sideArrowAngle * Mathf.PI / 180f);
                    float arrowyPos    = Mathf.Lerp(yRange.y, yRange.x, (viewScale.value - Prefs.minScale) / (Prefs.maxScale - Prefs.minScale));
                    Handles.ArrowHandleCap(0, new Vector2(xRange.x + arrowXOffset, arrowyPos), Quaternion.Euler(0, (Prefs.sideFlip ? 90 : -90) + Prefs.sideArrowAngle, 0), Prefs.sideArrowSize, EventType.Repaint);
                    Handles.Label(new Vector2(xRange.x + arrowXOffset / 2, arrowyPos), "缩放等级", Prefs.sideMarkStyle);
                }
                Handles.color = Color.white;

                //画双击指示
                if (doubleClickMarkAlpha.value > 0)
                {
                    Handles.color = new Color(1, 1, 1, doubleClickMarkAlpha.value);
                    Handles.DrawSolidDisc(cameraRotation * doubleClickMarkRawPos + (Vector3)center, Vector3.back, (1 - doubleClickMarkAlpha.value) * Prefs.doubleClickMarkRadius);
                    Handles.color = Color.white;
                }

                //画元素
                Handles.color = Prefs.elementOutLineColor;
                {
                    foreach (GameObject g in Selection.gameObjects)
                    {
                        PrefabType prefabType = PrefabUtility.GetPrefabType(g);
                        if (prefabType != PrefabType.Prefab)
                        {
                            Handles.DrawSolidDisc(GetElementGUIPos(g.transform.position), Vector3.back, Prefs.elementRadius + Prefs.elementOutlineWidth);
                        }
                    }
                    foreach (GameObject g in invalidObjectList)
                    {
                        Handles.color = GetElementColor(g);
                        Handles.DrawSolidDisc(GetElementGUIPos(g.transform.position), Vector3.back, Prefs.elementRadius);
                    }

                    MapGroup group = GroupList[MapSystem.currentGroupIndex];
                    DrawElement(group, 1);

                    group = GroupList[MapSystem.GetPrevious(MapSystem.currentGroupIndex)];
                    DrawElement(group, Prefs.elementAlpha);

                    group = GroupList[MapSystem.GetNext(MapSystem.currentGroupIndex)];
                    DrawElement(group, Prefs.elementAlpha);
                }
                Handles.color = Color.white;


                //控制
                MapSystem.SetCurrentAngle(QuaternionToAngle(targetQuaternion.value.eulerAngles.y));

                //视图旋转
                if (mouseDragAngle.value != 0)
                {
                    Quaternion deltaRot = Quaternion.Euler(0, mouseDragAngle.value, 0);
                    SceneView.lastActiveSceneView.pivot    = deltaRot * SceneView.lastActiveSceneView.pivot;
                    SceneView.lastActiveSceneView.rotation = deltaRot * SceneView.lastActiveSceneView.rotation;
                }
            }
            break;

            case EventType.MouseDown:
                SetMouseArea();
                switch (mouseArea)
                {
                case MouseArea.GroupArea:
                    //双击
                    if (Event.current.clickCount > 1)
                    {
                        SceneView.lastActiveSceneView.LookAt(GetElementWorldPos(Event.current.mousePosition, 0));
                        SetDoubleClickMark();
                    }

                    //选中组
                    Selection.activeGameObject = null;
                    MapInspector.FocusOn(GroupList[areaIndex], MapInspector.SelectionType.Group);

                    targetQuaternion.target = Quaternion.Euler(0, areaIndex * MapSystem.AnglePerGroup + MapSystem.AnglePerGroup / 2, 0);
                    break;

                case MouseArea.ObjectArea:
                    //双击
                    if (Event.current.clickCount > 1)
                    {
                        SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position);
                        SetDoubleClickMark();
                    }

                    //选中物体
                    GameObject objectSelected = areaIndex >= 0 ? GroupList[MapSystem.currentGroupIndex].transform.GetChild(areaIndex).gameObject : invalidObjectList[-areaIndex - 1];
                    Selection.activeGameObject = objectSelected;

                    break;

                case MouseArea.Invalid:
                case MouseArea.DragArea:
                case MouseArea.Center:
                    //选中map
                    Selection.activeGameObject = null;
                    MapInspector.FocusOn(null, MapInspector.SelectionType.Map);
                    break;
                }
                break;

            case EventType.MouseDrag:
                if (Event.current.button == 1)
                {
                    //right click
                    SceneView.lastActiveSceneView.rotation = Quaternion.Euler(0, Event.current.delta.x / 2, 0) * SceneView.lastActiveSceneView.rotation * Quaternion.Euler(Event.current.delta.y / 2, 0, 0);
                }
                else
                {
                    switch (mouseArea)
                    {
                    case MouseArea.ScollArea:
                    case MouseArea.GroupArea:
                    case MouseArea.DragArea:
                        Vector3 mouseDir          = Event.current.mousePosition - center;
                        float   mouseDirSqrLength = mouseDir.sqrMagnitude;
                        float   dragAngle         = -Vector3.Cross(mouseDir, Event.current.delta).z / mouseDirSqrLength * 180 / Mathf.PI * Prefs.dragSensitivity;

                        mouseDragAngle.value  = dragAngle;
                        mouseDragAngle.target = 0;

                        break;

                    case MouseArea.ObjectArea:
                        Undo.RecordObject(Selection.activeGameObject.transform, "Moving Object");
                        Selection.activeGameObject.transform.position = GetElementWorldPos(Event.current.mousePosition, Selection.activeGameObject.transform.position.y);
                        break;
                    }
                }
                break;

            case EventType.MouseUp:
                switch (mouseArea)
                {
                case MouseArea.ObjectArea:
                    SetMapObject(Selection.activeGameObject);
                    break;
                }
                break;

            case EventType.ScrollWheel:
                viewScale.target = Mathf.Clamp(viewScale.target - Event.current.delta.y * Prefs.scaleSensitivity, Prefs.minScale, Prefs.maxScale);
                break;
            }

            //Debug Message
            ShowDebugMessage();
        }