【问题标题】: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 轴上拖放 3d 对象时,如何让它完全跟随鼠标?
【发布时间】:2019-07-23 00:21:08
【问题描述】:

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

我希望对象跟随鼠标,但它的移动方向与鼠标相同,只是速度较慢。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我将通过从指针投射到表面水平的平面来获得世界空间中的起始位置。然后在拖动时,执行相同的光线投射。求第一次raycast与当前raycast的差异,并将其添加到物体的起始位置,得到物体的新位置:

    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);
        }
    }
    

    【讨论】:

    • 非常非常非常非常非常好。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多