【问题标题】:Unity2D - Rigidbody not stopping when it reaches a positionUnity2D - 刚体到达某个位置时不会停止
【发布时间】:2020-05-08 12:34:39
【问题描述】:

我有这个代码:

public class MoveCard : MonoBehaviour
{
public float speed = 1f;
public Rigidbody2D rb;
public Vector2 pos = new Vector2(6.8f,0);
public bool move = false;
void FixedUpdate(){
    if (move){
           //Stops Rigidbody
           if (rb.position == pos){
               move = false;
            }
            rb.transform.position += -rb.transform.right * speed * Time.fixedDeltaTime;      
    }
}
public void CardMovement(){
    move = true;
}
}

我将其设置为当按下按钮时,CardMovement() 会启动,并且在 FixedUpdate 中我有一个 if 语句,当刚体到达某个位置时会关闭移动。 rb 移动,但在到达 Vector2 时并没有停止。我是 Unity 的新手,所以我不知道这是否是这样做的方法。

【问题讨论】:

  • 我不相信rb.position == pos 每一个都是真的。我的意思是 rb.position 每fixedDeltaTime 移动一定量,所以Vector2(12.092, 8.128) 永远不会等于Vector2(12, 8)(组成数字)。您需要测试 equivalence>=

标签: unity3d vector


【解决方案1】:

好吧,您的 Rb 并没有准确地传递初始位置和 Vector2 之间的每个点。 rb.position == pos 不太可能,因为一帧不够,下一帧会太多:)

尝试使用 MoveTowards。有些是这样的:

rb.position = Vector3.MoveTowards(rb.position, pos, speed * Time.fixedDeltaTime);

你不需要声明来停止它,因为它会在到达 pos 时停止。

PD:如果你不打算使用物理并且你只想要一个运动,你可以用变换而不是刚体来做到这一点。

【讨论】:

    【解决方案2】:

    不要像这样比较 2 个 vector2D 值:

    if(rb.position == pos)
    

    而是将它们之间的距离与一个非常小的值进行比较,如下所示:

    if(Vector2.Distance(rb.position,pos) <= 0.01)
    

    此外,如果位置足够近,您可以像 rb.postion = pos; 这样设置位置,以便捕捉到正确的位置。

    【讨论】:

    • 速度设置为1时它可以工作,但我设置为2时它一直在移动。为什么会这样,有解决办法吗?
    • 问题是当你直接改变一个变换的位置时,它不会移动到新的位置而是跳到它,跳过中间的所有东西。当您以 2 的速度移动时,您一次跳过较大的部分,因此跳过了该点,永远不会足够接近。
    • 一种解决方案可能是根据您的速度增加 0.01 的值、使用更大的值或以不同的方式移动。
    • 尝试使用 MoveTowards,这就是使用 MoveTowards 的地方。距离是一种高成本方法,因为它使用平方根,并且您的游戏对象不会完全停在该点上,而是停在 ponit +/-0.01 距离或您在声明中放置的数字处。
    • 如果你想使用距离。考虑 distance(vA, vB) 与 (vA-vB).magnitude 相同,您可以使用 (vA-vB).sqrmagnitude 来避免这个平方根并使程序更高效。
    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多