繁体   English   中英

我怎样才能使用Unity2d.velocity跟随Unity中的对象?

[英]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.fixedDeltaTimeTime.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);
    }
}

直接更改速度始终是一个坏习惯,应避免。 而是始终与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM