为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
泛舟湖上清波郎朗 2021-12-25 18:22:21
我需要玩家跟随移动的目标并在到达目标时准确停止。玩家必须在每一帧中几乎立即到达目标,所以我需要一种高速的方式来做到这一点。我无法使用 Transform.translate,因为我的游戏中有很多物理实现,而使用 Transform.translate 或 movetowards 会使物理问题变得麻烦。是否有任何基于物理学的方法来跟踪目标?速度,AddForce,什么?对于 2D 游戏。任何线索将不胜感激!谢谢!
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

请执行下列操作:

1 .通过将“重力比例”设置为 0 来禁用重力。

2 .将 BodyType 更改为 Kinematic。

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

最后,如果您仍然有生涩的运动,请将Interpolate选项从None更改为 InterpolateExtrapolate。我还建议减少下面的速度变量。

//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);

    }

}


查看完整回答
反对 回复 2021-12-25
?
Qyouu

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),只需稍微调整一下并找到适合游戏的值


查看完整回答
反对 回复 2021-12-25
  • 2 回答
  • 0 关注
  • 628 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信