如何使用 rigidbody2d.velocity 在 Unity 中跟随对象?



我需要玩家跟随移动的目标,并在它到达目标时准确停止。 播放器必须在每一帧中几乎立即到达目标,所以我需要一种高速的方式来做到这一点。

我无法使用 Transform.translate,因为我的游戏中有很多物理实现,使用 Transform.translate 或 movetowards 会使物理错误。

有没有基于物理的方法来跟踪目标?速度,添加力,任何东西?对于 2D 游戏。 任何线索将不胜感激!谢谢!

如果你有一个Rigidbody2D你想跟随另一个对象,Rigidbody2D.MovePosition是移动它的正确方法。

执行以下操作:

1.通过将"重力刻度"设置为 0 来禁用重力。

2.将"身体类型"更改为"运动学"。

3.现在,您可以使用Rigidbody2D.MovePosition函数移动Rigidbody对象以跟随另一个游戏对象。请参阅下面的代码。这应该在FixedUpdate函数中完成,并使用Time.fixedDeltaTime而不是Time.deltatime

最后,如果仍然出现生涩的运动,请将插值选项从">"更改为">插值"或"外推"。我还建议减少下面的速度变量。

//Object to follow
public Transform target;
//Rigidbody to move
public Rigidbody2D rb2d;
public float speed = 7.0f;
//Distance to start moving
public float minDistance = 0.09f;
void FixedUpdate()
{
//Find direction
Vector3 dir = (target.transform.position - rb2d.transform.position).normalized;
//Check if we need to follow object then do so 
if (Vector3.Distance(target.transform.position, rb2d.transform.position) > minDistance)
{
rb2d.MovePosition(rb2d.transform.position + dir * speed * Time.fixedDeltaTime);
}
}

直接改变速度始终是一种不好的做法,应该避免。相反,请始终使用 AddForce。 我会计算目标和身体之间的距离,并根据该距离添加一个力。

var dif = target.transform.pos - body.transform.pos;
bodyRigid.AddForce(dif * multiplier * Time.deltatime);

该解决方案带来的唯一问题可能是,一旦目标关闭,身体就会在目标周围"摇晃"。 您可以通过检查身体是否接近目标然后冷冻来避免这种情况。

var dif = target.transform.pos - body.transform.pos;
if(dif.magnitude > 1) {
bodyRigid.AddForce(dif * multiplier * Time.deltatime);
} else {
bodyRigid.velocity = Vector2.zero;
}

虽然我说直接设置速度是一个坏习惯,但用它来冻结身体应该没问题。我不知道这是否会破坏你在游戏中使用的其他物理特性,事实上,这只会冻结你的对象。 您还可以更改冻结所需的距离(if 语句中的 1(,只需稍微玩一下并找到适合游戏的值即可

最新更新