Использование цикла do while заморозит единство - PullRequest
0 голосов
/ 02 июня 2018

Итак, я хочу, чтобы моя доска прошла от точки A до B , а затем останавливается, когда она достигает B. Я реализовал do while loop, for-loop, но, к сожалению, единство зависает каждый раз, когда я нажимаю кнопку воспроизведения сцены, есть идеи, почему это происходит?

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
    } 
}

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Как видно из комментария выше вашего Update-метода, Update () вызывается один раз за кадр.Цикл while блокирует Update () до тех пор, пока условие не будет выполнено, но никогда не будет выполнено, когда вы блокируете метод Update ().

Попробуйте что-то подобное

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
}

Итак, когда вызывается ваш метод обновления, вы запускаете цикл while, но условие цикла while можетникогда не будет заполнен, потому что gameloop никогда не сможет достичь ProcessPhysics ().

Для справки см. https://docs.unity3d.com/Manual/ExecutionOrder.html

0 голосов
/ 02 июня 2018

Ваш цикл do while будет выполняться Rigidbody2d.velocity = new Vector2(1f, 0f); каждый раз.В этом цикле ничего не меняется.Если бы вы сделали:

while (x < y)
{
    a = 5;
    x++;
}

Не было бы никакого смысла делать это.Просто a = 5 будет иметь тот же эффект, только намного меньше ненужных циклов.

Кроме того, вы вообще не меняете значение x.Вот что вызывает проблему.Вы в основном делаете

while (x < y)
    a = 5;

Если x был меньше y в начале, x всегда будет меньше y, поэтому он продолжит выполнение тела while цикл навсегда, и поэтому Unity застрял в методе Update.

Это не имеет ничего , связанного с тем фактом, что 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;
    }                                               
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...