首页 > 解决方案 > 陷入无限循环,不知道如何逃脱(团结)

问题描述

我目前正在开发 Unity,代码似乎陷入了无限循环

void Start()
{
    button = false;

    x = 50;

    y = 50;
}
void Update()
{
    transform.RotateAround(Vector3.zero, Vector3.back, x * Time.deltaTime);


    if (Input.GetButtonUp("Jump")) 
    {
        if (button == false)
        {
            button = true;
           
        }
        else
        {
            button = false;
                            
        }
        
    }
    while (button == true)
    {
        Vector3 pivotPosition = GameObject.Find("fire").transform.position;
        transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
        x = 0;
        y = 50;
    }

    while (button == false)
    {
        Vector3 pivotPosition = GameObject.Find("ice").transform.position;
        transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
        x = 50;
        y = 0;
    }
}

}

该代码是关于更改对象的枢轴,使其有点像游戏中的冰与火之舞。问题似乎是while循环,它创建了一个无限循环,阻止我启动代码。如果你知道如何解决这个问题,请帮助我......

标签: c#

解决方案


您的代码会将 Y 设置为 50 并重复(数千次)将 Y 设置为 50,直到代码的某些部分更新“按钮”,在这种情况下,它将 Y 设置为 0 并将 X 设置为 5 万次,直到再次更改按钮之后它将最终退出该方法。您需要在您的问题中更明确地说明如何/何时更改按钮,但您需要为您的 while 循环制定更好的退出条件。如果您想在没有无限循环的情况下进行测试,您可以执行类似的操作

if (Input.GetButtonUp("Jump")) 
    button = !button
if (button)
{
    Vector3 pivotPosition = GameObject.Find("fire").transform.position;
    transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
    x = 0;
    y = 50;
}
else
{
    Vector3 pivotPosition = GameObject.Find("ice").transform.position;
    transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
    x = 50;
    y = 0;
}

如果您确实希望该代码继续运行,直到按钮再次受到影响,您可以执行类似的操作

public async Task StartSpinVector(){
     if (button)
        while(button)
     {
          Vector3 pivotPosition = GameObject.Find("fire").transform.position;
          transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
          x = 0;
          y = 50;
          await Task.Delay(50);//so we don't go nuts, wait 50 ms before repeating
      }
      else 
         while(!button)
       {
           Vector3 pivotPosition = GameObject.Find("ice").transform.position;
             transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
             x = 50;
             y = 0;
             await Task.Delay(50);//so we don't go nuts, wait 50 ms before repeating
        }
       }

然后在你的主更新代码中,调用(但不要等待)这个方法,这样你的更新就不会变得绝对疯狂

   private Task updateLoopTask;
   void Update(){
        ...
        updateLoopTask = StartSpinVector();//save the task in case we want to await it later or something
   }

或者您可能想做其他事情,如果您详细说明您的问题,我们可以做出更具体的答案


推荐阅读