2017-01-18 5 views
0

Я стараюсь это:Как создать Wait/Delay/Pause

void RUN() 
{ 
    Debug.Log("Before Corutine"); 
    StartCoroutine(Test()); 
    Debug.Log("After Corutine"); 
} 


IEnumerator Test() 
{ 
    Debug.Log("Before Wait"); 
    yield return new WaitForSeconds(5); 
    Debug.Log("After Wait"); 
} 

И я получаю:

Перед Corutine
Перед Wait
После Corutine
(через 5 секунд)
По истечении

Моя мечта это получить:

Перед Corutine
Перед Wait
(подождите 5 секунд)
После Wait
После Corutine

Возможно ли это?

+0

Возможный дубликат: http://stackoverflow.com/questions/30267537/unity-need-to-return-value-only-after-coroutine-finishes – jdmdevdotnet

+1

@AlGoreRhythm Они не связаны. OP не хочет возвращать значение. Хотя это дубликат многих * других * вопросов. Просто их больше не найти. – Programmer

+0

Ну, да, ему не нужно возвращать данные. Но в этом ответе четко объясняется, как делать синхронную сопрограмму, которой и нуждается ОП. Ответ все тот же (см. Предоставленную службу ответа, то же самое). – jdmdevdotnet

ответ

3

Вам необходимо сделать RUN сопрограмму (при необходимости отрегулировать все вызовы), и вам нужно будет yield результат StartCoroutine.

EDIT:

IEnumerator RUN() 
{ 
    Debug.Log("Before Corutine"); 
    yield return StartCoroutine(Test()); 
    Debug.Log("After Corutine"); 
} 


IEnumerator Test() 
{ 
    Debug.Log("Before Wait"); 
    yield return new WaitForSeconds(5); 
    Debug.Log("After Wait"); 
} 

Где вы звоните RUN(), теперь вы должны позвонить с StartCoroutine(RUN());.

+0

Благодарим за ответ. Но я показал только прототип. В реале Test() есть несколько переменных и возвращаем переменную и ... это рекурсия proc :( Вот почему я не хочу создавать RUN() как coroutine :( Представляю результаты, рассчитанные RUN(), используя Test(), и это быстро. Вот почему я хочу сделать небольшую задержку внутри Test(). – user3246203

+0

@ user3246203 Это не меняет ответ. Насколько вам может не понравиться coroutine, то есть решение. Вы все еще можете рекурсивно называть сопрограмму. – Servy

+1

@ user3246203 Я думаю, вам нужно прочитать, как работает асинхронное программирование lol. Если вы не хотите, чтобы RUN был IEnumerator, возможно, вы можете открыть поток? Не использовали Unity через некоторое время, но вполне уверен, что вы могли бы просто открутить новый асинхронный поток и не иметь самого метода IEnumerator. – jdmdevdotnet