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

2024 ж. 19 Сәу.
25 412 Рет қаралды

В этом видео мы рассмотрим принцип работы корутин в юнити. Чем они отличаются от асинхронных методов и как зависят от цикла обновления юнити.
Ссылка на Discord - / discord
ASYNC/AWAIT - • Асинхронное программир...
LINQ и свой итератор - • LINQ в C#. Продвинутое...
Паблик игроделов - vk.com/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

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

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

    @lomion46@lomion462 жыл бұрын
  • Спасибо за видео!

    @MrWatchmanLP@MrWatchmanLP2 жыл бұрын
  • Спасибо за контент, дядь)

    @user-wg5rf8xp3p@user-wg5rf8xp3p2 жыл бұрын
  • Отлично и понятно. Спасибо.

    @user-nm5zh2zb8c@user-nm5zh2zb8c2 жыл бұрын
  • Спасибо , как всегда занимательно.

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

    @SowilTM@SowilTM2 жыл бұрын
  • Спасибо огромное!

    @vladimircuraciov@vladimircuraciov2 жыл бұрын
  • Офигенский ролик, Спасибо!

    @donbolshoff8965@donbolshoff8965 Жыл бұрын
  • Спасибо

    @qwertysalo8665@qwertysalo86652 жыл бұрын
  • Очень круто!

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

    @leksaysdevelopment7423@leksaysdevelopment74232 жыл бұрын
    • Да, старт бывает удобен для этого

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

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

    @behappianstudio3576@behappianstudio35762 жыл бұрын
    • Попробуй Invoke в корутине, вызываемой в Invoke!

      @luckyjava6588@luckyjava65882 жыл бұрын
    • Смотрел видео emerald powder? Оно даст старт

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

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

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

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

      @gaitavr1992@gaitavr19922 жыл бұрын
    • @@gaitavr1992 Да, я смотрел их, но теперь смотрю твой канал.

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

      @AlexStraga@AlexStraga2 жыл бұрын
    • ​@@gaitavr1992 Дуже чекаю на ваші нові відео, повертайтесь скоріше(

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

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

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

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

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

      @ruslan_yefimov@ruslan_yefimov2 жыл бұрын
  • Подписался

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

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

      @gaitavr1992@gaitavr19922 жыл бұрын
    • @@gaitavr1992 и то хорошо. Спасибо

      @aibaster@aibaster2 жыл бұрын
  • Возьми меня в ученики 🙌 Мастер

    @jugo-stream@jugo-stream2 жыл бұрын
  • Был, смотрел, норм.

    @DmitryTimofeev_general@DmitryTimofeev_general2 жыл бұрын
    • Кто бы сомневался)

      @user-nm5zh2zb8c@user-nm5zh2zb8c2 жыл бұрын
  • WaitUntil теперь всегда буду юзать для отслеживания нажатия клавиш)

    @daniilparokonnyy7980@daniilparokonnyy79802 жыл бұрын
    • Надеюсь, не для управления..

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

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

      @gaitavr1992@gaitavr19922 жыл бұрын
  • так и не понял, а что по оптимизации, что выгоднее использовать

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

    @vladoscrafter5117@vladoscrafter51172 жыл бұрын
    • А что не так в стратегии?

      @gaitavr1992@gaitavr19922 жыл бұрын
  • прошу передать спасибо Роману Сакутину за совет перейти на этот канал)

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

    @alexkokarew1574@alexkokarew15742 жыл бұрын
    • ага, сделать каждую паутину реально корутиной xd

      @ruslan_yefimov@ruslan_yefimov2 жыл бұрын
  • Прям уровень Университета))

    @user-jx7pc9ku7b@user-jx7pc9ku7b2 жыл бұрын
    • Не то слово. Я даже законспектировал некоторые моменты из ролика в тетрадь.

      @YooPita@YooPita2 жыл бұрын
    • Даже лучше..

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

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

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

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

    @nwsx357@nwsx3572 жыл бұрын
    • Откуда пришел? Фейсбук, контакт или что-то еще? Чисто для статистики)

      @gaitavr1992@gaitavr19922 жыл бұрын
    • @@gaitavr1992 по стилю коммента понятно, что от сакутина

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

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

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

    @andreypan1608@andreypan16082 жыл бұрын
  • Максим, как можно с вами связаться? Есть предложение по работе

    @5hillsgames470@5hillsgames4702 жыл бұрын
    • Я не заинтересован в дополнительной работе

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

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

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

    @user-ct3pn9ib6f@user-ct3pn9ib6f2 жыл бұрын
    • Да

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

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

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

      @koishigarin@koishigarin2 жыл бұрын
    • Разница в одном потоке

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

    @user-uk9pv6bx7z@user-uk9pv6bx7z2 жыл бұрын
  • 1 - 4 - (если нажмут на пробел) - 5 - 2 - 3

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

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

      @TheTempterable@TheTempterable2 жыл бұрын
  • Почему бы не сказать сопрограмма? Coroutine это сопрограмма.

    @AleksYurchenko@AleksYurchenko Жыл бұрын
  • 1,4,5,2,3?

    @Ruslon-oc3pt@Ruslon-oc3pt2 жыл бұрын
    • да, он в видео потом циферки поменял как оно будет.

      @alekseigolub4336@alekseigolub43362 жыл бұрын
  • запустил и забыл это Invoke(nameof(Method), magicNumber);

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

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

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

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

      @archon7th@archon7th2 жыл бұрын
    • Если коллеги пишут в императивном стиле, а слово паттерн вызывает ассоциацию с синглтоном, то вопросов нет

      @gaitavr1992@gaitavr19922 жыл бұрын
  • только вот является ли карутина по факту асинхронной, можно ли ее так называть

    @lkghost7@lkghost72 жыл бұрын
    • не является

      @vatyunga@vatyunga2 жыл бұрын
    • асинхронная, если вызвать её через таску)

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

    @eugenebahmatsky2552@eugenebahmatsky25522 жыл бұрын
    • Первое предупреждение за мат, следом будет бан

      @gaitavr1992@gaitavr19922 жыл бұрын
    • @@gaitavr1992 не стоит. Лучше я отпишусь

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

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

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

    @igroteka90@igroteka90 Жыл бұрын
    • Давайте на вихід з цього каналу і розказуйте десь в іншому місці

      @gaitavr1992@gaitavr1992 Жыл бұрын
    • @@gaitavr1992 лайййкк

      @rahatbakum7852@rahatbakum785210 ай бұрын
  • 1 4 5 2 3

    @inatesi@inatesi2 жыл бұрын
KZhead