1. 程式人生 > >Unity基礎篇:Unity使用滑鼠拖動2D和3D物體。

Unity基礎篇:Unity使用滑鼠拖動2D和3D物體。

 /*
    首先說一下,Input.mousePosition是滑鼠所在畫素平面內的座標,需要根據自己的需求轉變成世界座標。
        Description 描述
        The current mouse position in pixel coordinates. (Read Only)


        在螢幕座標空間當前滑鼠的位置(只讀)。


        The bottom-left of the screen or window is at (0, 0). The top-right of the screen or window is at (Screen.width, Screen.height).


        螢幕或視窗的左下角是座標系的(0,0)座標。右上角的座標是(螢幕寬度值,螢幕高度值)。




    */

   //這裡用於2D場景物體的移動,可以參考一下。
    private bool isMouseDown;
    private Vector3 lastMousePosition = Vector3.zero;
    private void TwoDMove()
    {
        if (Input.GetMouseButtonDown(0))
        {
            isMouseDown = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            isMouseDown = false;
            lastMousePosition = Vector3.zero;//這裡要歸零,不然會有漂移效果
        }
        if (isMouseDown)
        {
            if (lastMousePosition != Vector3.zero)
            {
                Vector3 offset = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMousePosition;
                transform.position += offset;
            }
            lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);


        }
    }
 //這裡是使用Ray射線來控制物體移動,可是由於射線本身檢測速率的限制,並不適合持續的跟蹤移動。具體效果各位讀者試試便知。
    private void RayMove()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (isMouseDown)
        {
            if (Physics.Raycast(ray, out hit))
            {
                Vector3 offset = Input.mousePosition;
                hit.transform.position = new Vector3(hit.point.x, hit.point.y, hit.transform.position.z);
                Debug.DrawLine(ray.origin, hit.point);
            }
        }


    }
 /// <summary>
    /// 這裡是3D物體的移動,注意座標系的轉換即可。
    /// </summary>
    /// <returns></returns>


    //注意世界座標系轉化為螢幕座標系,Z軸是不變的
    IEnumerator OnMouseDown()
        {
            //將物體由世界座標系轉化為螢幕座標系,由vector3 結構體變數ScreenSpace儲存,以用來明確螢幕座標系Z軸的位置
            Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);
            //完成了兩個步驟,1由於滑鼠的座標系是2維的,需要轉化成3維的世界座標系,2只有三維的情況下才能來計算滑鼠位置與物體的距離,offset即是距離
            Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
            Debug.Log("down");
            //當滑鼠左鍵按下時
            while (Input.GetMouseButton(0))
            {
                //得到現在滑鼠的2維座標系位置
                Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
                //將當前滑鼠的2維位置轉化成三維的位置,再加上滑鼠的移動量
                Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
                //CurPosition就是物體應該的移動向量賦給transform的position屬性
                transform.position = CurPosition;
                yield return new WaitForFixedUpdate();
        }
    }