Rigidbody.Moveposition问题

时间:2018-02-21 07:42:21

标签: unity3d

我正在尝试用Rigidbody制作一种射弹:

private void FiredAsProjectile(GameObject target)
{
    Vector3 moveVector = Vector3.Zero;
    float velMod = 8f // A placeholder value to later calculate with mass / velocity

    if(target != null)
    {
        moveVector = (target.transform.position - transform.position);
        m_rb.MovePosition(transform.position + moveVector * Time.deltaTime * velMod);
    }
}

在其他地方调用此方法时,通过FixedUpdate更新。我有一些事情我需要这样做:有速度输出并移动到一个位置,而不是方向。

但是,我得到了一个奇怪的结果。即使此对象作为运动刚体移动并且其插值设置为“无”,此对象在到达目标矢量之前也会减速,就像它具有插值一样。假设我想要从枪管发射一颗子弹并飞到世界的一个点而不是方向,这就是我希望这个物体表现得像,但不是那样。

我错过了什么或误解了什么吗? 是否有更好的方法来移动这个运动刚体,同时仍然输出刚体。速度并仍然碰撞?

1 个答案:

答案 0 :(得分:1)

这是因为您不Normalize moveVector

为了解释为什么会发生这种情况,我们假设每一步Time.deltaTime = 0.01

  • t0时,让我们说移动物体(x = 0)和目标物体(x = 100)之间的距离为100。
  • MovePosition的参数是0 + 100*8*.01 = 8,对象会相应地移动到这个新位置(因为你说它的运动没有插值)
  • t1时间,moveVector = 100-8 = 92
  • 现在新的参数是8 + 92*8*.01 = 15.36

请注意,在t0t1之间移动了8个单位,而t1t2之间只移动了7.36个单位。因此,您的移动物体越靠近目标物体,您移动物体的次数就越少,从而减慢了物体的速度。 (而且它永远不会到达目标物体,你将停留在等于最小浮点数精度的距离上)。

为了解决这个问题,您只需要对moveVector进行标准化,即每一步都修复其模块。所以,只需添加以下行:

moveVector = (target.transform.position - transform.position);
moveVector.Normalize();
m_rb.MovePosition(transform.position + moveVector * Time.deltaTime * velMod);

并且无论距离如何,每一步移动的距离总是相同的。