Как писать асинхронный код в юнити. Корутины для продвинутых

Поділитися
Вставка
  • Опубліковано 9 чер 2024
  • В этом видео мы рассмотрим принцип работы корутин в юнити. Чем они отличаются от асинхронных методов и как зависят от цикла обновления юнити.
    Ссылка на Discord - / discord
    ASYNC/AWAIT - • Асинхронное программир...
    LINQ и свой итератор - • LINQ в C#. Продвинутое...
    Паблик игроделов - special3d
    "00:00 - Введение"
    "00:30 - Зачем нужны корутины"
    "03:17 - Что такое IEnumerator"
    "05:35 - Порядок вызовов юнити событий"
    "06:46 - Принцип работы корутины"
    "09:50 - Как написать yield инструкцию"
    "11:45 - Сравнение корутины и асинхронного метода"
    "14:32 - Кеширование yield инструкции"
    Поддержка канала:
    Patreon - www.patreon.com/user?u=32502669
    В крипте:
    BTC - 16WmTb4VTFGYrwEjjnMKNNMMzsMB1rPEqD
    ETH - 0x8d35406f8317b846528d0a9ea4a34ce59968dff2
    XRP - rLW9gnQo7BQhU6igk5keqYnH3TVrCxGRzm (TAG - 1438215071)
    LTC- MNSWdzdVsUMnozSU5HhUPEscfxaUK3Fdck
    #unity3d #coroutine #async #gamedev #ityoutubersru

КОМЕНТАРІ • 104

  • @user-bc4me5kz7j
    @user-bc4me5kz7j 3 роки тому +39

    Спасибо большое за видео. Лучший канал по "подкопотной" юнити, да и юнити в целом

  • @lomion46
    @lomion46 3 роки тому +7

    Огромная благодарность за разбор потрохов движка. Очень и очень интересовала вся подноготная от непосредственно работающего со всем этим, а не просто развлекательный контент.

  • @user-wg5rf8xp3p
    @user-wg5rf8xp3p 3 роки тому +3

    Спасибо за контент, дядь)

  • @SowilTM
    @SowilTM 3 роки тому +4

    Спасибо, Максим. Очень качественная и понятная подача информации, продолжай в том же духе.

  • @petrosaslanidis
    @petrosaslanidis 3 роки тому

    Спасибо , как всегда занимательно.

  • @donbolshoff8965
    @donbolshoff8965 Рік тому

    Офигенский ролик, Спасибо!

  • @MrWatchmanLP
    @MrWatchmanLP 3 роки тому +1

    Спасибо за видео!

  • @user-nm5zh2zb8c
    @user-nm5zh2zb8c 3 роки тому

    Отлично и понятно. Спасибо.

  • @easycodeunity3d14
    @easycodeunity3d14 2 роки тому

    Знай я это вчера, наверняка прошел бы собес в одну именнитую компанию )) Крутой канал, очень много полезного

  • @leksaysdevelopment7423
    @leksaysdevelopment7423 3 роки тому +1

    Кайфовый видос ! Спасибо что делишься опытом и даешь инфу по теме в сжатом формате, не размазывая инфу на 100 видосов.
    По поводоу IEnumerator в MonoBehaviour функциях.
    Если ты работаешь с VR, то для того, чтобы начать работать с инпутом от рук, нужно, чтобы шлем их нашел. А это зависит от юзера, который может показать или спрятать руки от камер шлема, и от того, насколько быстро шлем найдет и передаст в игру данные о руках.
    Получается, если тебе нужно инициализировать какой-то класс в Start с использованием данных от рук (кости пальцев, позиция рук и т.д.), то нужно подождать, пока шлем передаст данные о руках. Вот в таком случае я использую IEnumerator Start().
    Можно, конечно, это все раскидать на 2 метода и делать условия, но вроде проще все сделать в старте.

    • @gaitavr1992
      @gaitavr1992  3 роки тому

      Да, старт бывает удобен для этого

  • @Diyozen
    @Diyozen 3 роки тому

    Очень круто!

  • @vladimircuraciov
    @vladimircuraciov 3 роки тому

    Спасибо огромное!

  • @behappianstudio3576
    @behappianstudio3576 3 роки тому +3

    Круто! Пошёл юзать Invoke!
    Как всегда ничего не понял))) Но это мои личные проблемы! Спасибо за ваш труд, надеюсь, скоро я преисполнюсь!

    • @luckyjava6588
      @luckyjava6588 3 роки тому +1

      Попробуй Invoke в корутине, вызываемой в Invoke!

    • @gaitavr1992
      @gaitavr1992  3 роки тому +1

      Смотрел видео emerald powder? Оно даст старт

    • @behappianstudio3576
      @behappianstudio3576 3 роки тому +1

      @@gaitavr1992 Порой сложно переучиваться с чего-то, особенно, если не собираешься становиться в этом деле профи. Меня научили пользоваться корутинами только как таймерами, а дальше уже как пойдёт. Поэтому без желания даже смысла не вижу))) Просто стараюсь из каждого вашего видео брать что-то полезное по стилистике и по структуре. Ну и слушать главное, мало ли усвою!

  • @qwertysalo8665
    @qwertysalo8665 3 роки тому +1

    Спасибо

  • @user-rh8ut2lf8o
    @user-rh8ut2lf8o 3 роки тому

    Огромное спасибо за видео и отдельно за ответ на просьбу. Подобных видео должно быть побольше в Ютубе. 👍 p.s. ответ я знал, но вряд-ли так рассказал.

    • @gaitavr1992
      @gaitavr1992  3 роки тому +3

      Что-то за последние месяца на моей памяти 4 канала перестали выпускать видео. Brackeys, Flatingo, Emerald Powder, insane One. Наверное площадки другие нашли или приоритеты поменялись

    • @user-rh8ut2lf8o
      @user-rh8ut2lf8o 3 роки тому

      @@gaitavr1992 Да, я смотрел их, но теперь смотрю твой канал.

    • @AlexStraga
      @AlexStraga 3 роки тому +3

      @@gaitavr1992 Бреки к сожалению все, так и сказали. Остальные видимо либо заняты, либо подустали. Себастьян вон тоже не часто выпускает видосы.

    • @illia_ryzhii
      @illia_ryzhii Рік тому

      ​@@gaitavr1992 Дуже чекаю на ваші нові відео, повертайтесь скоріше(

  • @semenshchepkin1333
    @semenshchepkin1333 Рік тому

    Максим, привет!
    спасибо за видео. всё изложенное понятно, однако, есть вопрос в контексте Task VS Coroutine:
    я только начал знакомство с юнити (есть опыт в бэкэнде), и сразу встрял с тасками - мой код прекрасно работает в редакторе и в скомпилированной для десктопа версии, но в браузере - нет. я вычитал, что таски вообще не поддерживаются в WebGL из-за однопоточности js. правильно ли я понял, что для браузерных игр мой единственный выход - писать всё на корутинах?
    если да, я обескуражен, и мне кажется, что это критически важный момент, который необходимо явно проговаривать в подобных видео)

  • @rednecksstudio3207
    @rednecksstudio3207 3 роки тому +3

    Спасибо за видео, очень приятно что ты берёшь углублённый уровень за основу в видео. Хотел вкинуть идею на счёт паттерна Singleton, в обществе много дискуссий на тему этого паттерна. Можешь рассказать о его плюсах, минусах и чем чревато его использование в коде, или же как его правильно правильно использовать.

    • @YooPita
      @YooPita 2 роки тому

      Синглтон это не паттерн, а скорее вредная практика, если мы условились, что прогаем в ООП, потому что это тупо нарушает его принципы. Если тебе нужен контейнер для хранения данных, то создай его и ссылайся на него, если нужны методы не требующие создания объекта используй статик. И учись описывать объекты без "Controller" или "GameManager". Твой вопрос не про синглтон, а про ООП, изучи ООП, научись мыслить в его парадигмах и тогда вопрос про функциональный синглтон отпадёт сам по себе.

    • @vatyunga
      @vatyunga 2 роки тому +2

      @@YooPita Статик это то же самое что и синглтон, нет разницы что использовать (если речь о сущности с состоянием). Думаю совет "изучи ООП и научись мыслить в его парадигмах" применим и к вам. Вообще статик используется только для чего-то вроде Unity.Mathf. Всё что имеет состояние не должно быть статик.

    • @YooPita
      @YooPita 2 роки тому

      @@vatyunga Создавать целый класс и называть его Mathf это вообще пиздец. Равняться на говнокод юнити это не правильно. Математика не может быть объектом, это скорее пространство имён, которое содержит набор статических классов вроде Abs, Sin и т.д. Ну это если говорить о том, как на самом деле обстоят дела с ООП в юнити. А так логика верная "всё что имеет состояние не должно быть статик". Только синглтон это статик который хочет иметь состояние.

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      @@YooPita Если погуглить мнение ведущих разрабов в отрасли, то ООП нужно далеко не везде и не всегда - много где понятней и короче писать синглтоны и то, что вы назвали говнокодом) ООП зачастую невозможно применить в коде, только вот на то это и парадигма - всего лишь набор концепций и правил, а не правда в последней инстанции

  • @aibaster
    @aibaster 3 роки тому

    Интересное видео. Спасибо за контент. Вопрос. Будут ли записаны видео по WPF к примеру?Не только по юнити(паттерны,работы джунов) же контент делать)

    • @gaitavr1992
      @gaitavr1992  3 роки тому +4

      Из не юнити планируется только ASP.NET, но там скорее опыт использования с пониманием того, что я далеко не опытный в этом деле. Java и Objective C в контексте плагинов тоже наверняка будут. WPF мне не зачем

    • @aibaster
      @aibaster 3 роки тому

      @@gaitavr1992 и то хорошо. Спасибо

  • @DmitryTimofeev_general
    @DmitryTimofeev_general 3 роки тому +1

    Был, смотрел, норм.

  • @jugo-stream
    @jugo-stream 3 роки тому +1

    Возьми меня в ученики 🙌 Мастер

  • @daniilparokonnyy7980
    @daniilparokonnyy7980 3 роки тому +1

    WaitUntil теперь всегда буду юзать для отслеживания нажатия клавиш)

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      Надеюсь, не для управления..

  • @Xa4_Xakum
    @Xa4_Xakum Рік тому

    прошу передать спасибо Роману Сакутину за совет перейти на этот канал)

  • @BulatBulatov
    @BulatBulatov 2 роки тому

    Подписался

  • @Pravda-bw3tj
    @Pravda-bw3tj 2 роки тому

    так и не понял, а что по оптимизации, что выгоднее использовать

  • @artemartem1235
    @artemartem1235 Місяць тому

    Надо обязательно упомянуть, что таски не останавливаются при выходе из плеймода

  • @artursveshnikov7668
    @artursveshnikov7668 2 роки тому +1

    Ваще не понятно, но очень интересно))
    Я так понимаю в dotnet вообще такой проблемы нет. Всегда пользовался async/await и он более чем справляется. Слышал, что корутины в котлине есть, а оказывается у соседей по цеху из юнити тоже)

    • @gaitavr1992
      @gaitavr1992  2 роки тому +1

      Принцип работы слишком разный у этих двух инструментов. Когда появилась корутина - юнити не поддерживала шарп с тасками

  • @vladoscrafter5117
    @vladoscrafter5117 3 роки тому

    Максим, хотел бы узнать, есть ли какая-то возможность создать хорошую Стейт машину не базируясь на патерне стратегия? Очень часто задаю себе этот вопрос, но достойного решения так и не нашел(

    • @gaitavr1992
      @gaitavr1992  3 роки тому

      А что не так в стратегии?

  • @nwsx357
    @nwsx357 3 роки тому +3

    хорошее видео, но я заметил одну неточность. у вас на канале в названии каждого видео написано «unity3d», а на самом деле движек называется просто «unity». Если просто вдруг кто спросит - будешь знать ыы. шутка. канал занятный. я новый подписчик ы

    • @gaitavr1992
      @gaitavr1992  3 роки тому

      Откуда пришел? Фейсбук, контакт или что-то еще? Чисто для статистики)

    • @andrewmolotkoff4231
      @andrewmolotkoff4231 3 роки тому +15

      @@gaitavr1992 по стилю коммента понятно, что от сакутина

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      Если начал кодить на той неделе, то конечно Unity, но раньше была приписка 3d)

    • @nwsx357
      @nwsx357 2 роки тому

      @@ruslan_yefimov а ты походу учил по этим высерам и теперь не знаешь как движек называется. скачай любую версию за любой год из архива и посмотри окно “about”

  • @user-ct3pn9ib6f
    @user-ct3pn9ib6f 2 роки тому +1

    Корутина всегда теряет 1 кадр, потому что, после того как мы дошли до yield инструкции проверка на isDone вызовется только в след кадре, и только после нее мы перейдем к блоку кода после yield инструкции. Правильно ?

  • @akstis4183
    @akstis4183 2 роки тому +4

    Никто почему-то не написал, почему при вызове корутины потеряется кадр. А потеряется он потому, что update вызывается раньше чем вызовется корутина?

    • @grimseal
      @grimseal 2 роки тому +1

      Тоже не понял этот момент, т.к. до этого автор говорит что при старте корутины она сразу до первой yield инструкции отрабатыват

    • @gaitavr1992
      @gaitavr1992  2 роки тому +1

      Попробуйте написать код с дебагом. Один дебаг после старта корутины, один внутри до yield return null, и один после

  • @user-jx7pc9ku7b
    @user-jx7pc9ku7b 3 роки тому +2

    Прям уровень Университета))

    • @YooPita
      @YooPita 2 роки тому

      Не то слово. Я даже законспектировал некоторые моменты из ролика в тетрадь.

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      Даже лучше..

  • @alexkokarew1574
    @alexkokarew1574 2 роки тому +1

    Захотелось сделать игру про павука, который пуляется корутиной. XD

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      ага, сделать каждую паутину реально корутиной xd

  • @YasnaKo
    @YasnaKo 2 роки тому +2

    На мой взгляд видео Emerald Powder нужно смотреть после этого. Я перечитала с десяток-другой статей/видео по теме, но почему-то в первый раз встретила такую простую но наглядную схему, поясняющую, чем же корутина отличается от обычной функции и что это такое. А примеры использования в мою голову не ложатся, пока я не пойму, что это вообще такое.

    • @YasnaKo
      @YasnaKo 2 роки тому +1

      Хех, если в прошлый подход к корутинам было понятно процентов 5, то теперь уже около 20, кайф)

  • @5hillsgames470
    @5hillsgames470 2 роки тому

    Максим, как можно с вами связаться? Есть предложение по работе

    • @gaitavr1992
      @gaitavr1992  2 роки тому +1

      Я не заинтересован в дополнительной работе

  • @4elowww742
    @4elowww742 Місяць тому

    Я использовал корутин зацикленный с методом

  • @CTePeoTun
    @CTePeoTun 3 роки тому

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

    • @gaitavr1992
      @gaitavr1992  3 роки тому

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

    • @koishigarin
      @koishigarin 3 роки тому

      ​@@gaitavr1992 А что скажете про UniTask? Там вроде идентично практически всё со стандартными async/await и привязка к player loop есть.

    • @gaitavr1992
      @gaitavr1992  3 роки тому

      Разница в одном потоке

  • @andreypan1608
    @andreypan1608 2 роки тому

    как сказал:
    Они являются полностью противоположными для удобного использования. 😁
    что хотел сказать:
    Они являются полностью противоположными. Поэтому они удобны.

  • @Ruslon-oc3pt
    @Ruslon-oc3pt 3 роки тому

    1,4,5,2,3?

    • @alekseigolub4336
      @alekseigolub4336 2 роки тому

      да, он в видео потом циферки поменял как оно будет.

  • @user-uk9pv6bx7z
    @user-uk9pv6bx7z 2 роки тому

    Я давно весь свой код переписал на асинхронку, пропали задержки при выполнении логики. Отличная вещь, если правильно пользоваться. А корутинами вовсе перестал пользоваться. Но, если делать это неумело, на асинхронках можно легко забить память и время процессора. Корутины в этом плане кажутся более безопасными. А чтобы асинхронный метод уничтожался вместе с обьектом и высвобождал память, я обычно делаю внешний bool, и подвязываю проверку bool внутри класса к OnDestroy и внутри асинхронного метода, после инициализации в классе OnDestroy меняю значения bool и асинхроннй метод уничтожается вместе с текущим классом куда он подвязан. Таким образом асинхронный метод при такой реализации никогда не останется в памяти после уничтожения обьекта\класса, и будет уничтожаться вместе с ним. И тогда можно не передавать в каждую асинхронную функцию токен на уничтожение, просто сделав его глобальным в текущем классе. Тоже как вариант реализации. Так же глобальный bool можно связать и с другими ключевыми событиями в классе MonoBehaviour, если это будет необходимо, например еще с OnDisable, чтобы при отключении обьекта, асинхронный код так же "уничтожался". Такой подход избавит от того, чтобы вручную прописывать уничтожение асинхронного метода как на 14:28 Но, тут еще зависит и от конкретных задач наверно, где то возможно быстрее будет написать код из примера на видео.

  • @lkghost7
    @lkghost7 2 роки тому +1

    только вот является ли карутина по факту асинхронной, можно ли ее так называть

    • @vatyunga
      @vatyunga 2 роки тому

      не является

    • @ruslan_yefimov
      @ruslan_yefimov 2 роки тому

      асинхронная, если вызвать её через таску)

  • @NoldoWalker
    @NoldoWalker 3 роки тому

    1 - 4 - (если нажмут на пробел) - 5 - 2 - 3

    • @evgenkonyshock4913
      @evgenkonyshock4913 3 роки тому

      Там keyUp используется, так что тут вернее будет "если не нажмут на пробел")

    • @TheTempterable
      @TheTempterable 3 роки тому +1

      @@evgenkonyshock4913 Еще вернее будет, если пробел был нажат, но в этот момент его отпустили

  • @archon7th
    @archon7th 3 роки тому +1

    запустил и забыл это Invoke(nameof(Method), magicNumber);

    • @gaitavr1992
      @gaitavr1992  3 роки тому +2

      Забудьте про этот метод. Его можно использовать только для прототипирования

    • @mimineko3100
      @mimineko3100 3 роки тому

      @@gaitavr1992
      ды ну? Это чего это? аргументы-то будут хоть какие-то?
      мало ли что кому-то он не нравится... но на нём всё отлично работает, адекватно и предсказуемо! в отличии от любых других альтернатив.
      Не нада так указывать людям, что им забывать, что не забывать, что применять и для чего.
      Это по меньшей мере, не корректно и самонадеяно.
      Единственный его минус - невозможность передачи параметров, но и это можно обойти.

    • @gaitavr1992
      @gaitavr1992  3 роки тому +2

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

    • @archon7th
      @archon7th 3 роки тому +1

      @@gaitavr1992 как по мне не сильно то и усложняющая. Достаточно помечать методы и не лепить их куда угодно при первой же возможности. А еще можно и к тестированию претензии предъявить )
      Я так скажу, а "запутать колег" можно куда круче с помощь какого-нибудь визитера чем корутиной или инвоком.

    • @gaitavr1992
      @gaitavr1992  3 роки тому +2

      Если коллеги пишут в императивном стиле, а слово паттерн вызывает ассоциацию с синглтоном, то вопросов нет

  • @AleksYurchenko
    @AleksYurchenko Рік тому

    Почему бы не сказать сопрограмма? Coroutine это сопрограмма.

  • @eugenebahmatsky2552
    @eugenebahmatsky2552 3 роки тому

    Круто удалять из листа во время фора! Проверяй код. Тебе надо тогда i не преращать, чтобы следующий элемент не проебать

    • @gaitavr1992
      @gaitavr1992  3 роки тому +3

      Первое предупреждение за мат, следом будет бан

    • @eugenebahmatsky2552
      @eugenebahmatsky2552 3 роки тому

      @@gaitavr1992 не стоит. Лучше я отпишусь

    • @YouSitePro
      @YouSitePro 3 роки тому +1

      @@gaitavr1992 , ))) Тебе указали на ошибку, в первую очередь. То, каким образом это сделано - уже второй вопрос.

    • @gaitavr1992
      @gaitavr1992  3 роки тому +5

      Для меня это первый вопрос, когда проявляется открытое неуважение - внятного ответа не будет

  • @igroteka90
    @igroteka90 Рік тому

    2:38 - не читабельным, а читаемым.
    Давайте говорить по-русски.

    • @gaitavr1992
      @gaitavr1992  Рік тому +1

      Давайте на вихід з цього каналу і розказуйте десь в іншому місці

    • @rahatbakum7852
      @rahatbakum7852 Рік тому

      @@gaitavr1992 лайййкк

  • @ivanfilatov5482
    @ivanfilatov5482 7 днів тому

    фу одноядерный кот

  • @inatesi
    @inatesi 2 роки тому

    1 4 5 2 3