Недопустимы следующие необходимые свойства: fb: app_id

Есть много способов подождать в Единстве. Это действительно просто, но я думаю, что стоит обратить внимание на большинство способов сделать это:

1. С сопрограммой и WaitForSeconds .

далеко простейший путь. Поместите весь код, который вам нужно подождать некоторое время в функции сопрограммы, вы можете подождать с помощью WaitForSeconds . Обратите внимание, что в функции coroutine вы вызываете функцию с помощью StartCoroutine(yourFunction).

Пример ниже повернет на 90 град, подождите 4 секунды, поверните на 40 градусов и подождите 2 секунды, а затем, наконец, поверните вращать 20 град.

void Start()
{
    StartCoroutine(waiter());
}

IEnumerator waiter()
{
    //Rotate 90 deg
    transform.Rotate(new Vector3(90, 0, 0), Space.World);

    //Wait for 4 seconds
    yield return new WaitForSeconds(4);

    //Rotate 40 deg
    transform.Rotate(new Vector3(40, 0, 0), Space.World);

    //Wait for 2 seconds
    yield return new WaitForSeconds(2);

    //Rotate 20 deg
    transform.Rotate(new Vector3(20, 0, 0), Space.World);
}

2. С сопрограммой и WaitForSecondsRealtime .

Единственная разница между WaitForSeconds и WaitForSecondsRealtime заключается в том, что WaitForSecondsRealtime использует немасштабированное время ожидания, что означает, что при приостановке игры с Time.timeScale функция WaitForSecondsRealtime не будет затронута, но WaitForSeconds будет.

void Start()
{
    StartCoroutine(waiter());
}

IEnumerator waiter()
{
    //Rotate 90 deg
    transform.Rotate(new Vector3(90, 0, 0), Space.World);

    //Wait for 4 seconds
    yield return new WaitForSecondsRealtime(4);

    //Rotate 40 deg
    transform.Rotate(new Vector3(40, 0, 0), Space.World);

    //Wait for 2 seconds
    yield return new WaitForSecondsRealtime(2);

    //Rotate 20 deg
    transform.Rotate(new Vector3(20, 0, 0), Space.World);
}

Подождите и вы сможете увидеть, сколько времени вы ждали:

3. С сопрограммой и приращением переменной каждый кадр с помощью Time.deltaTime .

Хорошим примером этого является то, когда вам нужно, чтобы таймер отображал на экране сколько времени он ждал. В принципе, как таймер.

Также хорошо, когда вы хотите прервать wait / sleep с переменной boolean, когда это правда. Здесь можно использовать yield break;.

bool quit = false;

void Start()
{
    StartCoroutine(waiter());
}

IEnumerator waiter()
{
    float counter = 0;
    //Rotate 90 deg
    transform.Rotate(new Vector3(90, 0, 0), Space.World);

    //Wait for 4 seconds
    float waitTime = 4;
    while (counter < waitTime)
    {
        //Increment Timer until counter >= waitTime
        counter += Time.deltaTime;
        Debug.Log("We have waited for: " + counter + " seconds");
        //Wait for a frame so that Unity doesn't freeze
        //Check if we want to quit this function
        if (quit)
        {
            //Quit function
            yield break;
        }
        yield return null;
    }

    //Rotate 40 deg
    transform.Rotate(new Vector3(40, 0, 0), Space.World);

    //Wait for 2 seconds
    waitTime = 2;
    //Reset counter
    counter = 0;
    while (counter < waitTime)
    {
        //Increment Timer until counter >= waitTime
        counter += Time.deltaTime;
        Debug.Log("We have waited for: " + counter + " seconds");
        //Check if we want to quit this function
        if (quit)
        {
            //Quit function
            yield break;
        }
        //Wait for a frame so that Unity doesn't freeze
        yield return null;
    }

    //Rotate 20 deg
    transform.Rotate(new Vector3(20, 0, 0), Space.World);
}

Вы все же можете упростить это, перемещая петлю while в другую функцию сопрограммы и уступая ее, а также все еще сможете видеть ее и даже

bool quit = false;

void Start()
{
    StartCoroutine(waiter());
}

IEnumerator waiter()
{
    //Rotate 90 deg
    transform.Rotate(new Vector3(90, 0, 0), Space.World);

    //Wait for 4 seconds
    float waitTime = 4;
    yield return wait(waitTime);

    //Rotate 40 deg
    transform.Rotate(new Vector3(40, 0, 0), Space.World);

    //Wait for 2 seconds
    waitTime = 2;
    yield return wait(waitTime);

    //Rotate 20 deg
    transform.Rotate(new Vector3(20, 0, 0), Space.World);
}

IEnumerator wait(float waitTime)
{
    float counter = 0;

    while (counter < waitTime)
    {
        //Increment Timer until counter >= waitTime
        counter += Time.deltaTime;
        Debug.Log("We have waited for: " + counter + " seconds");
        if (quit)
        {
            //Quit function
            yield break;
        }
        //Wait for a frame so that Unity doesn't freeze
        yield return null;
    }
}

Подождите / спящий режим до тех пор, пока переменная не изменится или не сравняется с другим значением:

4. С сопрограммой и WaitUntil :

Подождите, пока условие не станет true. Примером является функция, ожидающая, что оценка игрока будет 100, а затем загружает следующий уровень.

float playerScore = 0;
int nextScene = 0;

void Start()
{
    StartCoroutine(sceneLoader());
}

IEnumerator sceneLoader()
{
    Debug.Log("Waiting for Player score to be >=100 ");
    yield return new WaitUntil(() => playerScore >= 10);
    Debug.Log("Player score is >=100. Loading next Leve");

    //Increment and Load next scene
    nextScene++;
    SceneManager.LoadScene(nextScene);
}

5. С сопрограммой и функцией WaitWhile .

Подождите, пока условие true. Например, когда вы хотите выйти из приложения при нажатии клавиши эвакуации.

void Start()
{
    StartCoroutine(inputWaiter());
}

IEnumerator inputWaiter()
{
    Debug.Log("Waiting for the Exit button to be pressed");
    yield return new WaitWhile(() => !Input.GetKeyDown(KeyCode.Escape));
    Debug.Log("Exit button has been pressed. Leaving Application");

    //Exit program
    Quit();
}

void Quit()
{
    #if UNITY_EDITOR
    UnityEditor.EditorApplication.isPlaying = false;
    #else
    Application.Quit();
    #endif
}

6. С функцией Invoke :

Вы можете позвонить в Unity для вызова функции в будущем. Когда вы вызываете функцию Invoke, вы можете передать время ожидания, прежде чем вызывать эту функцию во второй параметр. Пример ниже вызовет функцию feedDog() после 5 секунд, когда вызывается Invoke.

void Start()
{
    Invoke("feedDog", 5);
    Debug.Log("Will feed dog after 5 seconds");
}

void feedDog()
{
    Debug.Log("Now feeding Dog");
}

7. С функцией Update() и Time.deltaTime .

Это как # 3, за исключением того, что он не использует сопрограмму. Он использует функцию Update.

Проблема заключается в том, что для этого требуется так много переменных, чтобы она не запускалась каждый раз, а только один раз, когда таймер закончился после ожидания.

float timer = 0;
bool timerReached = false;

void Update()
{
    if (!timerReached)
        timer += Time.deltaTime;

    if (!timerReached && timer > 5)
    {
        Debug.Log("Done waiting");
        feedDog();

        //Set to false so that We don't run this again
        timerReached = true;
    }
}

void feedDog()
{
    Debug.Log("Now feeding Dog");
}

Есть еще другие способы подождать в Unity, но вы обязательно должны знать те, о которых говорилось выше, поскольку это облегчает создание игр в Unity. Когда использовать каждый из них зависит от обстоятельств.

Для вашей конкретной проблемы это решение:

IEnumerator showTextFuntion()
{
    TextUI.text = "Welcome to Number Wizard!";
    yield return new WaitForSeconds(3f);
    TextUI.text = ("The highest number you can pick is " + max);
    yield return new WaitForSeconds(3f);
    TextUI.text = ("The lowest number you can pick is " + min);
}

И вызывать / запускать функцию сопрограммы с самого начала или Обновить вы вызываете его с помощью

StartCoroutine (showTextFuntion());

0
задан Haseeb Ahmad 13 July 2018 в 19:57
поделиться