Unity3d Unity2D-刚体到达某个位置时不停止

Unity3d Unity2D-刚体到达某个位置时不停止,unity3d,vector,Unity3d,Vector,我有以下代码: 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.posi

我有以下代码:

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语句,当刚体到达某个位置时关闭move。rb移动,但到达矢量2时不会停止。我是Unity的新手,所以我不知道这是否是一种方法。

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

if(rb.position == pos)
if(Vector2.Distance(rb.position,pos) <= 0.01)
rb.position = Vector3.MoveTowards(rb.position, pos, speed * Time.fixedDeltaTime);
而是将它们之间的距离与非常小的值进行比较,如下所示:

if(rb.position == pos)
if(Vector2.Distance(rb.position,pos) <= 0.01)
rb.position = Vector3.MoveTowards(rb.position, pos, speed * Time.fixedDeltaTime);

此外,您还可以设置如下位置:rb.position=pos;如果它足够近,以至于捕捉到正确的位置。

那么你的Rb不会准确通过初始位置和矢量2之间的每个点。 不太可能有rb.position==pos,因为一帧不够,下一帧太多:

尝试使用MoveToward。有些人喜欢这样:

if(rb.position == pos)
if(Vector2.Distance(rb.position,pos) <= 0.01)
rb.position = Vector3.MoveTowards(rb.position, pos, speed * Time.fixedDeltaTime);
你不需要一个语句来阻止它,因为它会在到达pos时停止


PD:如果你不想使用物理,你只想做一个运动,你可以用变换而不是刚体来做这件事。

我不相信rb.position==pos会是真的。我的意思是rb.position将每个固定的时间移动一定量,所以Vector212.092,8.128永远不会等于Vector212,8个组成的数字。您需要测试等效性或>=当速度设置为1时,它会工作,但当我设置为2时,它会继续移动。问题是,当你直接改变变换的位置时,它不会移动到新的位置,而是跳到新的位置,跳过中间的所有内容。当你以2的速度移动时,你一次跳过了较大的部分,因此跳过了该点,永远无法达到足够的距离。解决方法可能是随着你的速度放大0.01的值,使用较大的值,或者以不同的方式移动。尝试使用MoveToward,这就是使用MoveToward的地方。距离是一种高成本的方法,因为它使用平方根,并且您的游戏对象不会完全停在点上,而是停在ponit+/-0.01距离或您在语句中输入的数字处。如果您想使用距离。想想距离vA,vB与vA-vB相同。为了避免这个平方根并使程序更有效,可以使用vA-vB.sqrmagnitude。