Корутины, не могу разобратся как праеельно

Программирование на Юнити.

Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 10:11

Хотел заменить Update на корутину что б меньше проверок.
Написал следующее запуская новую корутину из старой.
Синтаксис:
Используется csharp
void Start
{
StartCoroutine(Man5Updator());
}
IEnumerator Man5Updator()
    {
       if (transform.position != targetPos)
        {
            Man5Anim.SetBool("Walk", true);
            Man5Navi.SetDestination(targetPos);
        }
        else
        {
            Man5Anim.SetBool("Walk", false);
        }
//и сдесь еще куча разных проверок которые должны происходить как в Update
yield return new WaitForSeconds(0.5f);
        RepCourMan5();
       yield break;
    }
    public void RepCourMan5()
    {
        StartCoroutine(Man5Updator());
    }

Мне человек на другом форуме предложил заменить конструкцию на
Синтаксис:
Используется csharp
void Start
{
    StartCoroutine(Man5Updator());
}
IEnumerator Man5Updator(Animator Man5Anim)
{

  var wait = new WaitForSeconds(0.5f);;

  while(true) {
 
    if (transform.position != targetPos)
    {
      Man5Anim.SetBool("Walk", true);
      Man5Navi.SetDestination(targetPos);
    }
    else
    {
      Man5Anim.SetBool("Walk", false);
     }  
    yield return wait;
  }    
}

Но к сожалению он не обяснил как она работает, я понимаю как работает цыкл, но не понимаю что дает yield return wait; и var wait = new WaitForSeconds(0.5f); Это перезапускает корутину?
Еще он мне сказал что я пложу новые корутины занимая память, но я думал что в моем варианте старая корутина исчезает после запуска новой после return break;
Пожалуйста объясните мне как правильно с этим работать.
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение TeslaGan 06 май 2021, 11:36

это называется флоу. внутри одного метода, программа работает сверху вниз. зачастую от открывающей скобки до закрывающей "{" "}"(есть исключения, но пока не будем о них) при этом, если мы внутри одного метода вызываем другой метод, первый метод будет ждать конца работы вызванного(можно представить как если бы мы код из второго метода вставили в первый, и процессор шел бы каждую инструкцию полученного кода сверху вниз).

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

касательно кода что вам дали: var wait = new WaitForSeconds(0.5f); - задержка, которую короутина будет ждать.
yeld return wait - приостанавливает движение потока, на задержку, хранимую в переменной wait
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Корутины, не могу разобратся как праеельно

Сообщение waruiyume 06 май 2021, 11:46

старая при этом переходит в ожидание, пока новая не отработает.

Нет. Чтобы родительская ждала дочернюю нужно yield return StartCoroutine(Foo())
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 11:51

waruiyume писал(а):
старая при этом переходит в ожидание, пока новая не отработает.

Нет. Чтобы родительская ждала дочернюю нужно yield return StartCoroutine(Foo())


Так ждет или уничтожается? Ну что ж вы меня путаете, это самое интересное для меня.
Ведь я сделал билд и тестил на телефоне, через 15 минут никаких фризов не появилось. У мменя на таких корутинах все uptate в игре заменены, поэьтому я и спрашиваю .
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение waruiyume 06 май 2021, 12:02

Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 12:09

waruiyume писал(а):https://docs.unity3d.com/ScriptReference/Debug.Log.html

ВСе , проверил, после вызова функции вставил строчку дебага, и она выводится, а ведь это значит что корутина доходит до строчки yield break? Я правильно понимаю?
Но теперь второй вопрос, а yield break убивает старую, или она висит просто в неактивном состоянии?
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение TeslaGan 06 май 2021, 12:31

waruiyume писал(а):
старая при этом переходит в ожидание, пока новая не отработает.

Нет. Чтобы родительская ждала дочернюю нужно yield return StartCoroutine(Foo())

хм... не знаю даже как к этому отнестись... с одной стороны - хорошо. это получило какую-то отказоустойчивость.
с другой - придется переписывать мои старые древние скрипты, которые на основе этой штуки создавали задержки...
p.s. я бы все равно задумался над рефакторингом кода... а то сперва мы вызываем короутины циклично, а потом пытаемся из дочерних потоков изменить поведение меин потока... (пару недель назад столкнулся с такой проблемой, программист, работающий на проекте до нас, решил удариться в многопоточность для генерации карты...)
Последний раз редактировалось TeslaGan 06 май 2021, 12:35, всего редактировалось 1 раз.
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 12:35

Люди, ну так кто то про yield break мне даст вменяемый ответ, как оно себя поведет, завершится, остановитя и повиснет, или уничтожится, что произойдет то?
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение waruiyume 06 май 2021, 12:49

В вашем случает break ничего не делает, выполнение и так завершится.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 12:52

waruiyume писал(а):В вашем случает break ничего не делает, выполнение и так завершится.

Я читал не помню где правда, что в каждой ветке корутины должен быть оператор return что то возвращающий, стоит ли оставить yield break или заменить на что то? И если да то на что?
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 13:33

TeslaGan писал(а):
waruiyume писал(а):
старая при этом переходит в ожидание, пока новая не отработает.

Нет. Чтобы родительская ждала дочернюю нужно yield return StartCoroutine(Foo())

хм... не знаю даже как к этому отнестись... с одной стороны - хорошо. это получило какую-то отказоустойчивость.
с другой - придется переписывать мои старые древние скрипты, которые на основе этой штуки создавали задержки...
p.s. я бы все равно задумался над рефакторингом кода... а то сперва мы вызываем короутины циклично, а потом пытаемся из дочерних потоков изменить поведение меин потока... (пару недель назад столкнулся с такой проблемой, программист, работающий на проекте до нас, решил удариться в многопоточность для генерации карты...)

по поводу изменения меин потока, если я правельно вас понимаю, то я где то читал что корутина работает в основном потоке, она не поддерживает многопоточность.
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение 1max1 06 май 2021, 15:51

Вопрос какой? Это?
var wait = new WaitForSeconds(0.5f); Это перезапускает корутину?

Нет.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Корутины, не могу разобратся как праеельно

Сообщение vitalik77 06 май 2021, 16:02

1max1 писал(а):Вопрос какой? Это?
var wait = new WaitForSeconds(0.5f); Это перезапускает корутину?

Нет.

Дочитайте до конца с комментариями и на вас снизойдет озарение, какой тут вопрос.
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56

Re: Корутины, не могу разобратся как праеельно

Сообщение TeslaGan 06 май 2021, 16:09

vitalik77 писал(а):
waruiyume писал(а):В вашем случает break ничего не делает, выполнение и так завершится.

Я читал не помню где правда, что в каждой ветке корутины должен быть оператор return что то возвращающий, стоит ли оставить yield break или заменить на что то? И если да то на что?

нет. не обязательно. yield break нужен на случай, если нам надо немедленно завершить короутину. например массив значений кончился. в вашем же случае можно просто убрать его
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Корутины, не могу разобратся как праеельно

Сообщение 1max1 06 май 2021, 16:32

vitalik77 писал(а):Дочитайте до конца с комментариями и на вас снизойдет озарение, какой тут вопрос.

Ааааааааааааааааааааааааааааааааааааааа, нужно было до конца читать, боже я такой тупой, извините, как-то не подумал даже...
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9