Я правильно понимаю сопрограммы? - PullRequest
0 голосов
/ 11 января 2020

Я пишу свою первую игру Unity. У меня есть ряд вложенных функций, давайте назовем их Function1, Function2, et c. Предположим, что в Function3 я хочу на короткое время отобразить что-то , прежде чем будет выполнен любой другой код .

Если я сделаю Function3 сопрограммой и выйду с возвращаемым выходом новых WaitForSeconds, то не останавливает выполнение всего кода в других моих функциях, а просто предотвращает выполнение остальной части кода в Function3, верно? Между тем, Функции 1 и 2 продолжают свой веселый путь.

Есть ли способ получить то, что я хочу, не перестраивая каждую функцию, чтобы она была сопрограммой и не добавляла множество выходов и в то же время истинных утверждений? (В моей настоящей игре довольно много функций, которые я бы предпочел быть сопрограммой.)

Я добавлю псевдокод, чтобы проиллюстрировать мою ситуацию.

Спасибо .

public Function1()
    {
        .
        .
        Does some stuff
        .
        .
        call Function2()
        .
        .
        Do some more stuff
        .
        .
    }

 public Function2()
 {
    .
    .
    Does some stuff
    .
    .
    StartCoroutine(Function3())
    .
    .
    Does some more stuff
    .
    .
    return to Function2;
 }

IEnumerator Function3()
{
    .
    .
    Does some stuff...
    Now I want to wait for specified time (say, .5 seconds) to display a message, play a sound, etc., **without continuing the code in Function2 or Function1 * *!
    yield return new WaitForSeconds(.5f)
    Then do some more stuff
    .
    .
    return to Function2;
 }

1 Ответ

1 голос
/ 11 января 2020

Есть несколько способов сделать это, однако я предпочитаю использовать действия обратного вызова, которые вызываются после «завершения» сопрограммы.

public IEnumerator Function1(Action callback)
{
    // do some stuff
    yield return new WaitForSeconds(1);
    // do some stuff
    callback.Invoke();
}

public IEnumerator Function2(Action callback)
{
    // do some stuff
    yield return new WaitForSeconds(1);
    // do some stuff
    callback.Invoke();
}

public void CallingMethod()
{
    StartCoroutine(Function1(() => 
    {
        StartCoroutine(Function2(() =>
        {
            // whatever other code you want executed
        }));
    }));
}

Этот подход избегает использования флагов классов (логических значений), которые может легко загромождать ваш код. Кроме того, это позволяет легко повторно использовать ваши методы.

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