Unity基礎篇:Unity使用滑鼠拖動2D和3D物體。
阿新 • • 發佈:2019-01-26
/*
首先說一下,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();
}
}