Задержка перед выходом из приложения и после завершения уровня [дубликат]

Сначала давайте рассмотрим некоторые основы ...

JRE является компонентом в NetBeans / Eclipse / standalone, который предоставит вам библиотеки, JVM, плагины Java и amp; Веб-начало Java. Обратите внимание, что он не предоставляет компиляторов или отладчиков.

JDK - это надмножество JRE наряду с compliers и debuggers.

Итак, когда у вас есть библиотека по умолчанию как JRE вместо JDK, у вас будет приятное время на импорт, но он не будет компилироваться.

Вместо этого укажите свой путь к JDK (я использую NetBeans, и я установил их с помощью netbeans.conf в netbeans / etc / netbeans.conf и измените путь).

8
задан Max Yankov 5 May 2015 в 15:48
поделиться

2 ответа

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

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());
18
ответ дан Programmer 20 August 2018 в 14:12
поделиться
  • 1
    Все из них (кроме invoke) являются сопрограммами. Это действительно единственный метод. – Tyler S. Loeper 7 October 2017 в 01:28
  • 2
    @TylerSigi № 7 использует функцию Update. Большинство остальных используют сопрограмму, но, как они ожидают, отличается . Их не добавили просто для удовольствия. Они нужны в разных сценариях, иначе вы не получите желаемого поведения, иначе вы в конечном итоге будете изобретать колесо, в то время как встроенные функции Unity должны обрабатывать некоторые вещи. – Programmer 7 October 2017 в 01:45

Вы были прав, чтобы использовать WaitForSeconds. Но я подозреваю, что вы пытались использовать его без сопрограмм. Вот как это должно работать:

public void SomeMethod()
{
    StartCoroutine(SomeCoroutine());
}

private IEnumerator SomeCoroutine()
{
    TextUI.text = "Welcome to Number Wizard!";
    yield return WaitForSeconds (3);
    TextUI.text = ("The highest number you can pick is " + max);
    yield return WaitForSeconds (3);
    TextUI.text = ("The lowest number you can pick is " + min);
}
3
ответ дан Max Yankov 20 August 2018 в 14:12
поделиться
  • 1
    я не понимаю ... я должен заменить SomeCoroutine тем, что? – DiogoSaraiva 5 May 2015 в 16:37
  • 2
    И я могу заставить это работать :( – DiogoSaraiva 5 May 2015 в 16:47
  • 3
    Вы должны поставить & quot; WaitForSeconds & quot; как ядро ​​iEnumerator для этого. Попробуйте прочитать на Unity Coroutines. Мне нравится эта статья. В нем объясняется, как делать то, что вы задаете в своем вопросе: unitypatterns.com/introduction-to-coroutines – Plastic Sturgeon 6 May 2015 в 01:20
Другие вопросы по тегам:

Похожие вопросы: