[英]How can i use rigidbody2d.velocity to follow an object in Unity?
我需要玩家跟随移动的目标,并在到达目标时准确停止。 玩家几乎必须在每一帧中即时到达目标,因此我需要一种高速的方法来完成它。
我不能使用Transform.translate,因为我的游戏中有很多物理实现,而使用Transform.translate或movetowards会使物理发生故障。
有没有基于物理学的方法来追踪目标? 速度,AddForce,还有什么? 对于2D游戏。 任何线索将不胜感激! 谢谢!
如果您有Rigidbody2D
跟随另一个对象, Rigidbody2D.MovePosition
是移动它的正确方法。
请执行下列操作:
1。通过将“重力比例”设置为0来禁用重力。
2。将BodyType更改为Kinematic。
3。现在,您可以使用Rigidbody2D.MovePosition
函数将Rigidbody
对象移动到另一个GameObject Rigidbody2D.MovePosition
。 请参见下面的代码。 这应该在FixedUpdate
函数中并使用Time.fixedDeltaTime
而不是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);
}
}
直接更改速度始终是一个坏习惯,应避免。 而是始终与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),只需稍作调整,然后找到适合游戏的值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.