Как я могу получить оставшееся время на сопрограмме Unity? - PullRequest
0 голосов
/ 09 апреля 2020

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

void test (){
    StartCoroutine(TestOne());
    if(Input.GetKey(KeyCode.A)){        // some way to get remaining time, or 
        StartCoroutine(TestTwo(time));  // something like this: 
                                        // float time = TestOne.GetRemainingTime();      
    }   
}

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Это во многом зависит от того, что вы пытаетесь сделать, но в Unity нет метода .GetRemainingTime ().

Общим решением является использование счетчика в вашей программе, что-то вроде ...

float remainingTimeA = 0f;

IEnumerator MyRoutineA()
{
    float duration = 2.0f //Two seconds

    remainingTimeA = duration; //Set the remaining time as the duration
    while(remainingTimeA > 0f) //While there is still time
    {
        remainingTimeA -= Time.deltaTime; //Reduce the timer with time between previous and actual frame
        yield return null; //Wait for this frame to end
    }
}

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

yield return null ожидает конца кадра, вместо new WaitForSeconds(duration) вы просто уменьшаете каждый кадр, в то время как вы уменьшаете свой таймер на Time.deltaTime это время между каждым кадром. Так что если с момента запуска сопрограммы прошла 1 секунда, оставшееся время должно быть равно 1,0f.

Надеюсь, все понятно.

0 голосов
/ 10 апреля 2020

Make test a IEnumerator:

IEnumerator test (){

    yield return StartCoroutine(TestOne());  //wait until TestOne() is over 

    yield return new WaitUntil(() => Input.GetKey(KeyCode.A)); //wait until user press A

    yield return StartCoroutine(TestTwo(time));  //wait until TestTwo(time) is over

}   

Последняя строка может быть только StartCoroutine(TestTwo(time));, если вам не нужен код для ожидания чего-либо еще.

This кстати, вам не нужно знать оставшееся время, вы просто ждете, пока оно не закончится, а затем запускаете все остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...