【问题标题】:Smoothly lerp a rigidbody平滑地处理刚体
【发布时间】:2014-05-19 14:35:35
【问题描述】:

我希望我的玩家在玩家点击屏幕左侧时向左移动。现在,我的播放器仅在我按住鼠标按钮时移动。我真正想要的是让他不断向左移动,直到我按下一次屏幕时他达到目标位置。

有人可以告诉我我的代码中缺少什么以允许这种情况发生吗?

void FixedUpdate() 
{

    if(Input.GetMouseButtonDown(0))
    {
        if(Input.mousePosition.x < (Screen.width*2)/3 && Input.mousePosition.y > Screen.height/3)
        {
            if(position == middle)
            {
                MoveLeft();
            }   
        }
    }
}

void MoveLeft()
{
    var pos = rigidbody.position;
    float xPosition = left.transform.position.x;
    pos.x = Mathf.Lerp(pos.x, xPosition, speed * Time.deltaTime);
    rigidbody.position = pos;
}

我的方法是在 FixedUpdate 中,因为我正在移动玩家刚体而不是平移实际玩家。

【问题讨论】:

  • 我必须查一下,lerp = 线性插值 ;)
  • 是的。这意味着在两点之间平滑移动一个对象。有一个 slerp 做同样的事情,但在球形运动中,对轨道等非常好。但不是我可以在这里使用的 :(
  • 对于初学者来说,如果你从 FixedUpdate() 调用方法,你应该使用 Time.fixedDeltaTime

标签: c# input unity3d rigid-bodies


【解决方案1】:

现在玩家只有在你点击鼠标按钮时才会移动,因为你的代码就是这样编写的:你检查鼠标是否每帧都被按下,并且只有当它移动刚体时。

如果你想让播放器移动不管鼠标是否按下,你应该创建某种变量来保存播放器的状态,并设置鼠标按下时向左移动并设置它当玩家到达他的目标时停止。

如果我正确理解了你的目标,它看起来像这样:

bool moveLeft = false;

void FixedUpdate() 
{

    if(Input.GetMouseButtonDown(0)
        && (Input.mousePosition.x < (Screen.width*2)/3 && Input.mousePosition.y > Screen.height/3))
    {
        moveLeft = true;
    }

    if (moveLeft
        && (position == middle))
    {
        MoveLeft();
    }
    else
    {
        moveLeft = false;
    }
}

void MoveLeft()
{
    var pos = rigidbody.position;
    float xPosition = left.transform.position.x;
    pos.x = Mathf.Lerp(pos.x, xPosition, speed * Time.deltaTime);
    rigidbody.position = pos;
}

【讨论】:

  • 感谢那个人的好声音。我想要的是让我的播放器仅在用户点击屏幕左侧时移动(现在我使用鼠标单击)然后它以快乐的方式移动直到它到达终点。我实施了您的检查,但是当我单击时它仍然只移动一小部分。我什至修改了左移以使用 Time.fixedDeltatime。
  • 好吧,为什么它停止了?当 moveLeft 为 true 时,它​​应该每帧调用 MoveLeft() 方法,将其设置为 false 是什么?
  • 啊,我明白了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多