C# 使用do while循环冻结统一性

C# 使用do while循环冻结统一性,c#,unity3d,C#,Unity3d,所以我想让我的支架从A点移动到B点,然后在到达B点时停止。我实现了do-while-loop,for-loop,但不幸的是,每次我点击play-scene按钮,unity就会冻结,知道为什么会发生这种情况吗 public class movingplank : MonoBehaviour { public Rigidbody2D Rigidbody2d; float x; Vector2 ve = new Vector2(); // Us

所以我想让我的支架从A点移动到B点,然后在到达B点时停止。我实现了
do-while-loop
for-loop
,但不幸的是,每次我点击play-scene按钮,unity就会冻结,知道为什么会发生这种情况吗

public class movingplank : MonoBehaviour 
{
    public Rigidbody2D Rigidbody2d;        
    float x;   
    Vector2 ve = new Vector2();

    // Use this for initialization
    void Start () 
    {
        Rigidbody2d = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update () 
    {  


        do 
        {   ve = Rigidbody2d.transform.position;
             x = ve.x;      // storing x component of my plank into float x 
           Rigidbody2d.velocity = new Vector2(1f, 0f);
        } while (x <-4);   // move plank till it reaches point B
    } 
}
公共类活动板:单一行为
{
公共刚体2d刚体2d;
浮动x;
Vector2 ve=新Vector2();
//用于初始化
无效开始()
{
Rigidbody2d=GetComponent();
}
//每帧调用一次更新
无效更新()
{  
做
{ve=刚体2d.transform.position;
x=ve.x;//将木板的x分量存储到float x中
刚体2d.velocity=新矢量2(1f,0f);

}while(xdo-while循环每次都将执行
Rigidbody2d.velocity=new Vector2(1f,0f);
。该循环中没有任何变化。如果您执行了:

while (x < y)
{
    a = 5;
    x++;
}
如果
x
在开始时小于
y
x
将始终小于
y
,因此它将在
循环时继续执行
的主体,从而在
更新
方法中卡住Unity

这与每帧调用一次
Update
无关。这只是一个简单的无限循环,因为使用了一个不变的条件。这将阻止程序,即使它在不同的函数中

以下是你可以做的:

// Using a property will always return the targets X value when called without having to 
// set it to a variable
private float X 
{ 
    // Called when getting value of X
    get { return Rigidbody2d.transform.position.X; } }  

    // Called when setting the value of X
    set { transform.position = new Vector2(value, transform.position.y); }  
}
private bool isMoving = false;

private void Update () 
{  

    if (X < -4 && !isMoving)
    { 
        Rigidbody2d.velocity = new Vector2(1f, 0f); // Move plank till it reaches point B
        isMoving = true;
    }
    else if (isMoving) 
    { 
        Rigidbody2d.velocity = new Vector(0f, 0f);  // You probably want to reset the 
                                                    // velocity back to 0
        isMoving = false;
    }                                               
} 
//调用时,使用属性将始终返回目标X值,而无需
//将其设置为变量
私人浮动X
{ 
//获取X的值时调用
获取{return Rigidbody2d.transform.position.X;}
//设置X的值时调用
set{transform.position=newvector2(值,transform.position.y);}
}
private bool isMoving=假;
私有无效更新()
{  
如果(X<-4&&!isMoving)
{ 
Rigidbody2d.velocity=新矢量2(1f,0f);//移动木板直到到达点B
isMoving=真;
}
否则如果(正在移动)
{ 
Rigidbody2d.velocity=新向量(0f,0f);//可能需要重置
//速度回到0
isMoving=假;
}                                               
} 

正如上面更新方法的注释所示,Update()每帧调用一次。 while循环将阻止Update(),直到条件已满,但当您阻止Update()-方法时,它将永远不会实现

试试这样的

void Update() 
{
     if(this.transform.position.x < -4) 
          Rigidbody2d.velocity = new Vector2(1f, 0f);
}
因此,当调用update方法时,您正在启动while循环,但是while循环的条件永远无法满足,因为gameloop永远无法到达ProcessPhysics()

有关参考信息,请参见
我的问题是什么?是不是我的问题,不是我,而是我假设投票是因为你有一段时间的条件而没有真正改变那个条件的价值。一个非常基本的错误。我身临其境地把它放进了循环中,现在检查它是否有意义?Esla,考虑Unity的游戏循环:1。(按顺序)运行其
Update()
方法。2.更新物理(将速度应用于每个对象的位置等)3.绘制场景。4.从1开始重复。您的方法阻止Unity进入第2步,因此x永远无法更改。您必须了解
Update()
每秒调用多次(例如:60 fps-它被称为60次)。@john感谢,这帮我澄清了一些疑问。但是在这种情况下使用if-else语句如何解决问题?为什么否决?问题的核心显然是对velocity+=new Vector3(1f,0.0f)的误解将增加刚体的x值,但在物理处理之前,仅在更新方法中增加速度不会产生任何效果。当然,这在编程上也是不正确的,但我认为主要问题是对unitys gameloop的误解。更改刚体的速度不会影响对象的位置ct,直到该帧的物理处理完成。因此,根据我的示例,摆脱while循环,这是阻塞的原因。弗雷德里克也许你应该在你的答案中添加一些关于游戏循环的信息。我认为埃斯拉仍然不清楚这个问题。P.S.我投票了,因为这显然是正确的解决方案。@Fredrik Widerberg,谢谢s代表你回答“如果”语句在这种情况下工作。但我想这不是很准确的方法,因为在更新方法中放入更多的内容会使应用程序运行速度变慢。一定有更好的方法来做到这一点。@Esla更新方法中放入更多的内容是什么?您应该查看属性,因为它们可以满足您的需要,但基本上是为您服务的。在本文中例如,每次您使用
X
时,它都会直接从转换中获取值,这意味着无论您在哪里使用它,它都会被更新,并且您不必在不同的函数中不断重新声明它。它被大写以显示它是一个属性。此外,它隐式地是
只读的
,因此如果我会尝试更改值,这正是我们想要的,因为更改
x
的值不会更改
gameObject
@Esla的真实
x
,您正在用while循环阻塞游戏循环。游戏会调用每个脚本的
Update()
方法依次绘制,然后重复。如果有while循环,则Update()方法无法完成,而其他Update()方法无法完成方法无法运行。您有效地暂停了游戏循环。此外,即使
.position
是引用类型,并且您正在从另一个线程更新它,您也在为局部变量分配x值,一种值类型,除非您使用相同的方法更新它,否则该变量将永远不会更新。private float x=>Rigidbody2d.transform.po
void Update() 
{
     if(this.transform.position.x < -4) 
          Rigidbody2d.velocity = new Vector2(1f, 0f);
}
while(running) 
{
   // Start of frame
   CallUpdateOnGameObjects();
   ProcessPhysics(); // this is where the rigidbody is moved
   DrawEverything();
   // End of frame
}