在unity中用鼠標實現在場景中拖動物體,用鼠標滾輪實現縮放


在場景中添加一個Plan,Camera,Directional Light,Cube。添加兩個腳本scrollerScirpt(掛在Camera),CubeDragScript(掛在Cube上)。

1.鼠標滾輪實現縮放:將攝像機的鏡頭拉近或者拉遠,調整攝像機的視角就可以實現,主要實現代碼如下:

void Update () {
        //鼠標滾輪的效果
        //Camera.main.fieldOfView 攝像機的視野
        //Camera.main.orthographicSize 攝像機的正交投影
        //Zoom out
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            if (Camera.main.fieldOfView <= 100) 
                Camera.main.fieldOfView += 2;
            if (Camera.main.orthographicSize <= 20)
                Camera.main.orthographicSize += 0.5F;
        }
        //Zoom in
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            if (Camera.main.fieldOfView > 2)
                Camera.main.fieldOfView -= 2;
            if (Camera.main.orthographicSize >= 1)
                Camera.main.orthographicSize -= 0.5F;
        }

}

  2.鼠標實現在場景中拖動物體:

  解決思路就是將世界坐標轉換成屏幕坐標,然后計算物體與鼠標之間移動量,循環鼠標被按下操作,得到鼠標的當前位置,加上計算好的移動量,將新的坐標賦值給物理就行了。主要是開啟一個協同程序(Corountine)來處理

   主要代碼如下:

// Use this for initialization
	void Start ()
	{
	    StartCoroutine(OnMouseDown());
	}

    IEnumerator OnMouseDown()
    {
        //將物體由世界坐標系轉換為屏幕坐標系
        Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三維物體坐標轉屏幕坐標
        //完成兩個步驟 1.由於鼠標的坐標系是2維,需要轉換成3維的世界坐標系  
        //    //             2.只有3維坐標情況下才能來計算鼠標位置與物理的距離,offset即是距離
        //將鼠標屏幕坐標轉為三維坐標,再算出物體位置與鼠標之間的距離
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
        while (Input.GetMouseButton(0))
        {
            //得到現在鼠標的2維坐標系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
            //將當前鼠標的2維位置轉換成3維位置,再加上鼠標的移動量
            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //curPosition就是物體應該的移動向量賦給transform的position屬性
            transform.position = curPosition;
            yield return new WaitForFixedUpdate(); //這個很重要,循環執行
        }
    }

  場景截圖如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM