我正在尝试用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更新。我有一些事情我需要这样做:有速度输出并移动到一个位置,而不是方向。
但是,我得到了一个奇怪的结果。即使此对象作为运动刚体移动并且其插值设置为“无”,此对象在到达目标矢量之前也会减速,就像它具有插值一样。假设我想要从枪管发射一颗子弹并飞到世界的一个点而不是方向,这就是我希望这个物体表现得像,但不是那样。
我错过了什么或误解了什么吗? 是否有更好的方法来移动这个运动刚体,同时仍然输出刚体。速度并仍然碰撞?
答案 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
请注意,在t0
和t1
之间移动了8个单位,而t1
和t2
之间只移动了7.36个单位。因此,您的移动物体越靠近目标物体,您移动物体的次数就越少,从而减慢了物体的速度。 (而且它永远不会到达目标物体,你将停留在等于最小浮点数精度的距离上)。
为了解决这个问题,您只需要对moveVector
进行标准化,即每一步都修复其模块。所以,只需添加以下行:
moveVector = (target.transform.position - transform.position);
moveVector.Normalize();
m_rb.MovePosition(transform.position + moveVector * Time.deltaTime * velMod);
并且无论距离如何,每一步移动的距离总是相同的。