我需要玩家跟随移动的目标,并在到达目标时准确停止。 玩家几乎必须在每一帧中即时到达目标,所以我需要一种高速的方法来实现它。
我无法使用Transform.translate,因为我的游戏中有很多物理实现,并且使用Transform.translate或movetowards使物理问题发生了变化。
是否有任何基于物理学的方法来跟踪目标?速度,AddForce,还有什么?对于2D游戏。 任何线索将不胜感激!谢谢!
答案 0 :(得分:2)
如果您有一个Rigidbody2D
要跟随另一个物体,则Rigidbody2D.MovePosition
是移动它的正确方法。
执行以下操作:
1 。通过将“重力比例”设置为0来禁用重力。
2 。将BodyType更改为Kinematic。
3 。您现在可以使用Rigidbody2D.MovePosition
函数将Rigidbody
对象移动到另一个GameObject之后。请参见下面的代码。这应该在FixedUpdate
函数中并使用Time.fixedDeltaTime
而不是Time.deltatime
来完成。
最后,如果仍然出现抖动,请将 Interpolate 选项从 None 更改为 Interpolate 或 Extrapolate 。我还建议减少下面的速度变量。
//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);
}
}
答案 1 :(得分:0)
直接更改速度始终是一个坏习惯,应该避免。而是始终与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),只需稍作调整即可找到适合游戏的值