2 回答
TA贡献2012条经验 获得超12个赞
如果你有一个Rigidbody2D
你想跟随另一个对象,这Rigidbody2D.MovePosition
是移动它的正确方法。
请执行下列操作:
1 .通过将“重力比例”设置为 0 来禁用重力。
2 .将 BodyType 更改为 Kinematic。
3 .您现在可以Rigidbody
使用该Rigidbody2D.MovePosition
功能移动对象以跟随另一个游戏对象。请参阅下面的代码。这应该在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);
}
}
TA贡献1786条经验 获得超11个赞
直接改变速度总是不好的做法,应该避免。而是始终使用 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),只需稍微调整一下并找到适合游戏的值
- 2 回答
- 0 关注
- 628 浏览
添加回答
举报