[英]When drag and dropping a 3d object on only the x and z axis, how do you let it follow the mouse exactly?
我只想在x和z軸上拖放對象。 到目前為止,代碼確實做到了這一點,只有對象的移動速度比鼠標慢。 如何使其完全跟隨鼠標?
由於我還不熟悉編碼,因此我嘗試將不同的代碼實現到我的代碼中,並嘗試根據所學知識對其進行編輯,但我無法弄清楚。
Vector3 dist;
Vector3 startPos;
float posX;
float posZ;
float posY;
void OnMouseDown()
{
startPos = transform.position;
dist = Camera.main.WorldToScreenPoint(transform.position);
posX = Input.mousePosition.x - dist.x;
posY = Input.mousePosition.y - dist.y;
posZ = Input.mousePosition.z - dist.z;
}
void OnMouseDrag()
{
float disX = Input.mousePosition.x - posX;
float disY = Input.mousePosition.y - posY;
float disZ = Input.mousePosition.z - posZ;
Vector3 lastPos = Camera.main.ScreenToWorldPoint(new Vector3(disX, disY, disZ));
transform.position = new Vector3(lastPos.x, 4.8f, lastPos.z);
}
我希望該對象跟隨鼠標,但是它的移動方向與鼠標相同,只是速度較慢。
通過從指針到表面平面的光線投射,我將在世界空間中獲得一個起始位置。 然后拖動,進行相同的光線投射。 找到從第一個光線投射到當前光線投射的差異,並將其添加到對象的起始位置以獲取對象的新位置:
Vector3 dist;
Vector3 startPos;
Vector3 startIntersect;
bool clickedOnGround = false;
void OnMouseDown()
{
clickedOnGround = false;
startPos = transform.position;
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
Plane groundPlane = new Plane(Vector3.down, new Vector3(0f, 4.8f, 0f));
float planeHitDist;
if (groundPlane.Raycast(cameraRay, out planeHitDist))
{
clickedOnGround = true;
startIntersect = cameraRay.GetPoint(planeHitDist);
}
}
void OnMouseDrag()
{
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
Plane groundPlane = new Plane(Vector3.down, new Vector3(0f, 4.8f, 0f));
float planeHitDist;
if (groundPlane.Raycast(cameraRay, out planeHitDist))
{
Vector3 newIntersect = cameraRay.GetPoint(planeHitDist);
transform.position = startPos + (newIntersect - startIntersect);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.