当仅在 x 和 z 轴上拖放 3d 对象时,如何让它完全跟随鼠标



我只想在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);
    }
}

最新更新