unity3d 分分鐘把unity3d的SceneView變成2D畫布

圖片描述

嗯。。把你的SceneView變成2D畫布一共須要兩步。
第一步是把它變成2D。
第二步是把它變成畫布。編輯器

經過代碼控制SceneView的攝像機進入2D模式。

炒雞簡單,SceneView裏提供了一個字段叫作in2DMode,開啓它會使SceneView的攝像機變成正交相機而且鎖定在Z軸上。
如下代碼呈現了這種切換的主要部分:ui

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。
你須要這樣作:this

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

而後屏蔽掉unity的內置邏輯,用本身的邏輯來代替。spa

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才行。rest

SceneView.onSceneGUIDelegate += OnSceneGUI;

如今,你能夠嘗試在編輯器中作各類2D刷子了。code

相關文章
相關標籤/搜索