1

图片描述

嗯。。把你的SceneView变成2D画布一共需要两步。
第一步是把它变成2D。
第二步是把它变成画布。

通过代码控制SceneView的摄像机进入2D模式。

炒鸡简单,SceneView里提供了一个字段叫做in2DMode,开启它会使SceneView的摄像机变成正交相机并且锁定在Z轴上。
以下代码呈现了这种切换的主要部分:

    bool _enabled;
    SceneView _sceneView;
    private bool _restoreCamera2DMode;
    private Vector3 _restoreCamearPosition;

    private void SetEnabled(bool value)
    {
        if (_enabled != value)
        {
            if (value)
            {
                _sceneView = SceneView.lastActiveSceneView;
                if (_sceneView == null) return;
                _restoreCamera2DMode = _sceneView.in2DMode;
                _restoreCamearPosition = _sceneView.pivot;

                _sceneView.in2DMode = true;
                _sceneView.LookAt(new Vector3(0, 0, -10));
                _sceneView.Repaint();
            }
            else
            {
                _sceneView.in2DMode = _restoreCamera2DMode;
                _sceneView.LookAt(_restoreCamearPosition);
            }
            _enabled = value;
        }
    }

重载掉SceneView上原生的鼠标输入,让你可以自定制画布相关的逻辑。

首先你最好把所有unity的Tool状态置为空。什么是Tool呢?
看图:clipboard.png
最左边的图标是ViewTool,其余四个图标是Tool。
你需要这样做:

            Tools.current = Tool.None;
            Tools.viewTool = ViewTool.None;

然后屏蔽掉unity的内置逻辑,用自己的逻辑来代替。

    void OnSceneGUI(SceneView scene)
    {
        Event e = Event.current;
        Vector2 mousePosition = e.mousePosition;
        
        // View point to world point translation function in my game.
        this._mousePosition = SceneScreenToWorldPoint(mousePosition);
       
        // Block SceneView's built-in behavior
        HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

        // ------------------------------
        // Your Custom OnGUI Logic
        // ------------------------------

        if (Event.current.type == EventType.MouseDown) Event.current.Use();
        if (Event.current.type == EventType.MouseMove) Event.current.Use();
    }

    private Vector3 SceneScreenToWorldPoint(Vector3 sceneScreenPoint)
    {
        Camera sceneCamera = _sceneView.camera;
        float screenHeight = sceneCamera.orthographicSize * 2f;
        float screenWidth = screenHeight * sceneCamera.aspect;

        Vector3 worldPos = new Vector3(
            (sceneScreenPoint.x / sceneCamera.pixelWidth) * screenWidth - screenWidth * 0.5f,
            ((-(sceneScreenPoint.y) / sceneCamera.pixelHeight) * screenHeight + screenHeight * 0.5f),
            0f);

        worldPos += sceneCamera.transform.position;
        worldPos.z = 0f;

        return worldPos;
    }

最后,为了让这一切可以起作用,你需要在切换进画布模式的时候把OnSceneGUI注册给SceneView才行。

SceneView.onSceneGUIDelegate += OnSceneGUI;

现在,你可以尝试在编辑器中做各种2D刷子了。


迷途吧
145 声望25 粉丝

看见好文章就翻译一下,发现一些细节就分享一下,也许没什么技术,只希望能被需要的人搜到。


引用和评论

0 条评论