像鼠标位置的移动一样在x轴上移动一个对象(Unity3d)

Move an object on x axis like the movement of the mouse position (Unity3d)

当我在屏幕上的任意位置单击时,我希望能够像鼠标位置一样在 x 轴上移动我的对象。这样我就可以拖动对象,而不是跳到点击位置只是为了跟随移动。

所以我做了两个脚本。在第一个脚本中,问题是对象直接跳转到我单击的位置。第二个脚本工作正常,但单击后,对象总是从我可以拖动它的相同位置开始。

//1st script
public Vector3 screenPoint;
private float? mousePoint;
private float mousePoint2;
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        mousePoint = Input.mousePosition.x;
        mousePoint2 = Input.mousePosition.x;
        screenPoint = Camera.main.WorldToScreenPoint(transform.position);
    }
    else if (Input.GetMouseButtonUp(0))
        mousePoint = null;

    if (mousePoint != null)
    {
        Vector3 curScreenPoint = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
        transform.position = new Vector3(curScreenPoint.x, transform.position.y, transform.position.z);
    }
}

}

//2nd script
private float difference;
private float? mousePoint;
private float mouseDistance1, mouseDistance2;
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        mousePoint = Input.mousePosition.x;
        mouseDistance1 = Input.mousePosition.x;
    }
    else if (Input.GetMouseButtonUp(0))
        mousePoint = null;
    if (mousePoint != null)
    {
        float mouseDistance2 = Input.mousePosition.x;
        difference = mouseDistance2 - mouseDistance1;
        transform.position = new Vector3((transform.position.x + difference) / 188, transform.position.y, transform.position.z);
    }
}

}

您在脚本 #2 中的想法是正确的,但实现起来似乎有点不对劲。每一帧,当按住鼠标(和 mousePoint != null)时,您减去鼠标原始 x 位置与其当前点之间的差异。然后,将该差异添加到对象的位置。这意味着,即使鼠标在移动后保持在一个位置,对象将继续移动,因为鼠标增量没有改变。


要解决此问题,您应该每帧重置鼠标增量,而不是让位置更改为 "compound." 此外,您应该删除 mouseDistance2 的私有声明 - 您已经定义了它两次。因此,您的代码应如下所示(省略未使用的变量):

private float? lastMousePoint = null;
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        lastMousePoint = Input.mousePosition.x;
    }
    else if (Input.GetMouseButtonUp(0)) {
        lastMousePoint = null;
    }
    if (lastMousePoint != null)
    {
        float difference = Input.mousePosition.x - lastMousePoint.Value;
        transform.position = new Vector3(transform.position.x + (difference / 188) * Time.deltaTime, transform.position.y, transform.position.z);
        lastMousePoint = Input.mousePosition.x;
    }
}

通过存储最后一个鼠标位置,您可以计算鼠标在最后一帧和当前帧之间移动的距离,然后将其添加到对象的位置。另外,请确保包含 Time.deltaTime 以便您的代码不依赖于帧率。希望对您有所帮助 - 如果您有任何其他问题,请告诉我。

最好从最后一条语句中删除 Time.deltatime 以便玩家可以顺利移动

 private float? lastMousePoint = null;
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        lastMousePoint = Input.mousePosition.x;
    }
    else if (Input.GetMouseButtonUp(0))
    {
        lastMousePoint = null;
    }
    if (lastMousePoint != null)
    {
        float difference = Input.mousePosition.x - lastMousePoint.Value;
        transform.position = new Vector3(transform.position.x + (difference / 188) , transform.position.y, transform.position.z);
        lastMousePoint = Input.mousePosition.x;
    }
}