Дождитесь завершения сопрограммы, прежде чем запускать другую сопрограмму [Unity C#]

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

void test ()
{   
    StartCoroutine (Coroutine1);
    StartCoroutine (Coroutine2);
}

генерируется только один из списков, что приводит к ошибке внутри Coroutine2. Но если я сделаю это:

IEnumerator Coroutine1(){
    for (int i = 0; i < numberOfListsToBeGenerated; i++) {
        //generate List
        yield return StartCoroutine(Coroutine2());
    }
}

Юнити замирает. Я использую сопрограммы для решения проблем с оптимизацией, так как создание списков может привести к зависанию.


person user4676310    schedule 19.05.2018    source источник
comment
Могут ли/используются ли списки в качестве свойства класса?   -  person Leon Willens    schedule 19.05.2018
comment
Два списка, сгенерированные в Coroutine1, являются свойствами Object1 и Object2 типа Class1. Coroutine2 должна генерировать List3 из Object1.List и Object2.List и использовать его как свойство Object3 типа Class2.   -  person user4676310    schedule 19.05.2018
comment
ты пробовал поставить yield return new WaitForEndofFrame   -  person Ginxxx    schedule 19.05.2018
comment
waitForEndOfFrame не помогает, ничего не изменилось   -  person user4676310    schedule 19.05.2018


Ответы (1)


Если вы хотите дождаться завершения одной сопрограммы, вы можете поместить yield return Coroutine1(); в первую строку тела Coroutine2 и поместить остальную часть кода после этого, таким образом, Coroutine2 будет ждать Coroutine1 до тех пор, пока оно не будет выполнено, а затем продолжится. остальной код.

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

IEnumerator Coroutine2() {
    yield return Coroutine1();

    //Coroutine1 is now finished and you can use its result
}
IEnumerator Coroutine1() {
    //create your lists then call yield return
    yield return null;
}
person Milad Qasemi    schedule 19.05.2018
comment
К сожалению, это тоже приводит к сбою Unity - person user4676310; 19.05.2018
comment
@IGClusterFck Смотрите только что сделанное мной редактирование, в ответе, который я исправил, была незначительная синтаксическая ошибка. Я также протестировал его, и он отлично работает. Обратите внимание, что вам не нужно yield return null, когда сопрограмма завершена, ее можно не выполнять. Вы все равно хотели бы yield где-то еще, если это необходимо (например, yield return WWW). - person Draco18s no longer trusts SE; 19.05.2018