【问题标题】:Move an object on x axis like the movement of the mouse position (Unity3d)像移动鼠标位置一样在 x 轴上移动对象(Unity3d)
【发布时间】:2023-03-08 01:31:01
【问题描述】:

当我单击屏幕上的任意位置时,我希望能够在 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);
    }
}

}

【问题讨论】:

    标签: c# unity3d mousemove


    【解决方案1】:

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


    要解决此问题,您应该每帧重置鼠标增量,而不是允许“复合”位置更改。此外,您应该删除 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,这样您的代码就不会依赖于帧速率。希望对您有所帮助 - 如果您有任何其他问题,请告诉我。

    【讨论】:

    • 感谢您的帮助,但现在我的对象只是跳到 x 轴上的 3 个接近点。第二个脚本的问题是,当我单击时,对象所做的第一个操作是总是跳转到一个相同的位置,然后它会随着鼠标移动。我只想从他的位置开始移动对象。
    • 啊!我第一次完全错过了!您将transform.position.x 除以 188,而实际上您应该只将差异除以 188。我更新了我的答案以反映这一点。它现在应该可以工作了
    【解决方案2】:

    最好从最后一条语句中删除 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;
        }
    }
    

    【讨论】:

    • 188从哪里来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多