Удерживайте или ждите, пока Coroutine заканчивает - PullRequest
1 голос
/ 16 марта 2012


В приведенном ниже примере, как я могу заставить FinishFirst () завершить сначала перед запуском DoLast (), сохраняя при этом подпись public void StartPage ()?


Я пытаюсь не заставлять "StartPage ()" возвращать IEnumerator, так как это заставит меня изменить его в интерфейсе. Было бы замечательно, если бы мой интерфейс для StartPage () поддерживал IEnumerator и Void без необходимости реализовывать оба.

public void StartPage()
{
    print("in StartPage()");
    StartCoroutine(FinishFirst(5.0f));
    DoLast();
    print("done");

}    

IEnumerator FinishFirst(float waitTime)
{
    print("in FinishFirst");        
    yield return WaitForSeconds(waitTime);
    print("leave FinishFirst");
}    

void DoLast()
{
    print("do after everything is finished");
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2013

Я знаю, что это старый вопрос, но если я правильно понимаю вопрос, что-то вроде этого работает.DoLast () будет выполняться в конце сопрограммы.

IEnumerator FinishFirst(float waitTime)
{
    print("in FinishFirst");        
    yield return WaitForSeconds(waitTime);
    print("leave FinishFirst");
    DoLast();
}  

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

0 голосов
/ 16 марта 2012

Использование объекта блокировки должно работать:

object lockObject = new object();

public void StartPage()
{
    print("in StartPage()");
    StartCoroutine(FinishFirst(5.0f));
    DoLast();
    print("done");

}    

IEnumerator FinishFirst(float waitTime)
{
    lock(lockObject)
    {
        print("in FinishFirst");        
        yield return WaitForSeconds(waitTime);
        print("leave FinishFirst");
    }
}    

void DoLast()
{
    lock(lockObject)
    {
        print("do after everything is finished");
    }
}
...