private void OnEnable()
 {
     instance = this;
     if (selectedEditor != null)
     {
         DestroyImmediate(selectedEditor);
     }
     selectedEditor           = null;
     Input.imeCompositionMode = IMECompositionMode.On;
     //autoRepaintOnSceneChange = true;
 }
        private void OnGUI()
        {
            toolbarSelected = GUILayout.Toolbar(toolbarSelected, toolbarTitle, Prefs.toolbarStyle);

            if (toolbarSelected == 0)
            {
                //物体

                if (PrefabInformation.Count == 0)
                {
                    //大小为空
                    GUILayout.Label("……", Prefs.mapAssetBackgroundStyle, GUILayout.ExpandHeight(true));
                }
                else
                {
                    //selection list
                    scollVector = GUILayout.BeginScrollView(scollVector);
                    {
                        List <string> assetNameList = new List <string>();
                        for (int i = 0; i < PrefabInformation.Count; i++)
                        {
                            assetNameList.Add(PrefabInformation.Keys[i].name);
                        }
                        EditorGUI.BeginChangeCheck();
                        prefabSelected = GUILayout.SelectionGrid(prefabSelected, assetNameList.ToArray(), 1, Prefs.mapAssetBackgroundStyle, GUILayout.Height(27 * PrefabInformation.Count));
                        if (EditorGUI.EndChangeCheck())
                        {
                            MapInspector.FocusOn(CurrentPrefab, MapInspector.SelectionType.Prefab);
                        }

                        GUILayout.Label("", Prefs.mapAssetBackgroundStyle, GUILayout.ExpandHeight(true));
                    }
                    GUILayout.EndScrollView();

                    //function
                    GameObject cp = CurrentPrefab;
                    GUILayout.BeginHorizontal(Prefs.mapAssetBackgroundStyle, GUILayout.Height(28));
                    {
                        GUILayout.FlexibleSpace();
                        if (GUILayout.Button("删除", GUILayout.Width(60)))
                        {
                            DeletePrefab(cp); prefabSelected--; MapInspector.FocusOn(CurrentPrefab, MapInspector.SelectionType.Prefab);
                        }
                    }
                    GUILayout.EndHorizontal();


                    //drag the prefab out
                    switch (Event.current.type)
                    {
                    case EventType.MouseDown:
                        tempPrefabInstance = PrefabUtility.InstantiatePrefab(CurrentPrefab) as GameObject;
                        Debug.Log(tempPrefabInstance);
                        break;

                    case EventType.MouseDrag:
                        if (tempPrefabInstance == null)
                        {
                            break;
                        }
                        Vector3 prefabPos = Vector3.zero;
                        if (mouseOverWindow == null)
                        {
                            validPos = false;
                        }
                        else if (mouseOverWindow.GetType() == typeof(MapManager))
                        {
                            MapManager mapManager = mouseOverWindow as MapManager;
                            Vector2    guiPos     = Event.current.mousePosition + position.position - mapManager.position.position;
                            prefabPos = mapManager.GetElementWorldPos(guiPos, 0);
                            validPos  = true;
                        }
                        else if (mouseOverWindow.GetType() == typeof(SceneView))
                        {
                            SceneView sv = SceneView.lastActiveSceneView;
                            Handles.SetCamera(SceneView.lastActiveSceneView.camera);
                            Vector2 guiPos = Event.current.mousePosition + new Vector2(position.xMin - sv.position.xMin, position.yMax - sv.position.yMax);
                            Ray     ray    = HandleUtility.GUIPointToWorldRay(guiPos);
                            float   yRate  = ray.origin.y / ray.direction.y;
                            prefabPos = new Vector3(ray.origin.x - ray.direction.x * yRate, 0, ray.origin.z - ray.direction.z * yRate);
                            validPos  = true;
                        }
                        else
                        {
                            validPos = false;
                        }
                        tempPrefabInstance.transform.position = prefabPos;
                        break;

                    case EventType.MouseUp:
                        DestroyImmediate(tempPrefabInstance);
                        break;

                    case EventType.Ignore:
                        if (validPos)
                        {
                            MapManager.SetMapObject(tempPrefabInstance);
                        }
                        else
                        {
                            DestroyImmediate(tempPrefabInstance);
                        }
                        break;
                    }
                }
            }
            else
            {
                //地图组预设
                if (MapGroupAssets.Count == 0)
                {
                    //大小为空
                    GUILayout.Label("……", Prefs.mapAssetBackgroundStyle, GUILayout.ExpandHeight(true));
                }
                else
                {
                    //selection list
                    scollVector = GUILayout.BeginScrollView(scollVector);
                    {
                        List <string> assetNameList = new List <string>();
                        for (int i = 0; i < MapGroupAssets.Count; i++)
                        {
                            assetNameList.Add(MapGroupAssets[i].groupName + (MapGroupAssets[i].baked ? "" : Prefs.mapAssetUnbakedStateMark));
                        }
                        EditorGUI.BeginChangeCheck();
                        mapAssetSelected = GUILayout.SelectionGrid(mapAssetSelected, assetNameList.ToArray(), 1, Prefs.mapAssetBackgroundStyle, GUILayout.Height(27 * MapGroupAssets.Count));
                        if (EditorGUI.EndChangeCheck())
                        {
                            MapInspector.FocusOn(CurrentAsset, MapInspector.SelectionType.GroupAsset);
                        }

                        GUILayout.Label("", Prefs.mapAssetBackgroundStyle, GUILayout.ExpandHeight(true));
                    }
                    GUILayout.EndScrollView();

                    //function
                    MapGroupAsset mga = CurrentAsset;
                    GUILayout.BeginHorizontal(Prefs.mapAssetBackgroundStyle, GUILayout.Height(28));
                    {
                        GUILayout.FlexibleSpace();
                        if (!mga.baked && GUILayout.Button("烘焙", GUILayout.Width(60)))
                        {
                            MapGroupAssetEditor.BakeGroupAsset(mga);
                        }
                        if (GUILayout.Button("删除", GUILayout.Width(60)))
                        {
                            MapGroupAssetEditor.DeleteGroupAsset(mga); mapAssetSelected = 0; MapInspector.FocusOn(CurrentAsset, MapInspector.SelectionType.GroupAsset);
                        }
                    }
                    GUILayout.EndHorizontal();
                }
            }
        }
Exemple #3
0
        private void CheckSelection()
        {
            if (!Active)
            {
                return;
            }
            selectionChecked = true;
            //Debug.Log("Selection changed.");

            //检查选择
            if (Selection.activeGameObject == null)
            {
                return;
            }
            if (Selection.activeGameObject.tag == "MapSystem")
            {
                if (Selection.activeGameObject.transform.childCount == 0)
                {
                    Selection.activeGameObject = null;
                    return;
                }
                else
                {
                    while (counter >= Selection.activeGameObject.transform.childCount)
                    {
                        counter -= Selection.activeGameObject.transform.childCount;
                    }
                    Selection.activeGameObject = Selection.activeGameObject.transform.GetChild(counter).gameObject;
                    counter++;
                    selectionChecked = false;
                    return;
                }
            }
            if (PrefabUtility.GetPrefabType(Selection.activeGameObject) == PrefabType.Prefab)
            {
                MapInspector.FocusOn(Selection.activeGameObject, MapInspector.SelectionType.Prefab);
                return;
            }

            //修正选择
            Transform parent = Selection.activeGameObject.transform.parent;

            if (parent != null)
            {
                if (parent.tag != "MapSystem")
                {
                    Selection.activeGameObject = parent.gameObject;
                    selectionChecked           = false;
                    return;
                }
                else
                {
                    MapInspector.FocusOn(Selection.activeGameObject, MapInspector.SelectionType.GameObject);
                }
            }
            else
            {
                SetMapObject(Selection.activeGameObject);
                MapInspector.FocusOn(Selection.activeGameObject, MapInspector.SelectionType.GameObject);
            }
        }
Exemple #4
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();
        }