Использование асинхронного кода (async / await) в C# в Unity. Разбираем на примерах

2024 ж. 2 Мам.
10 332 Рет қаралды

Для тех, кто еще не знаком с асинхронным кодом, у кого все руки не доходят разобраться с async и await, как и где их использовать, и почему async/await лучше корутин - новое видео! Как обычно с примерами, с толком, с расстановкой!
Кстати, лайки и донаты волшебным образом ускоряют процесс записи новых видео!
__________
Залетай в Таверну Разработчика в телеге, и делись своими траблами в Unity, вместе разбираться будем!
t.me/gamedevtavern
Подписывайся на канал в телеге, или на твиттер, там я публикую коротенькие типсы и практики, которые помогут писать код лучше, понятнее и эффективнее:
Telegram: t.me/gamedevlavka
Twitter: / gamedevlavka
Twitter (личный): / vavilichevgd
0:00 Вступление
0:35 Смотрим на Coroutine
3:27 Меняем Coroutine на async/await
6:22 Как сделать очередь из async/await
9:38 Как вернуть значение из асинхронного метода
13:21 Как подождать выполнение всех асинхронных методов

Пікірлер
  • Топовый канал, нужно больше просмотров, Очень структурно и понятно все спасибо вам.

    @viktorkobylyanskyy102@viktorkobylyanskyy1022 жыл бұрын
  • Спасибо за видео! Если есть возможность, затрагивайте больше паттернов, пожалуйста

    @user-sp5zo9nv7d@user-sp5zo9nv7d2 жыл бұрын
  • Спасибо за видео и объяснение ;) ты очень помогаешь развивать мозг!)

    @trytowinunity1445@trytowinunity14452 жыл бұрын
  • Интересная тема. С нетерпением ждем продолжение.

    @RimuruDev@RimuruDev Жыл бұрын
  • Спасибо, реально объясняешь легко и просто. Даже я понимаю :3

    @antonpashkevich5061@antonpashkevich5061 Жыл бұрын
  • давно хотел начать разбираться с асинхронностью:)

    @user-it9mg3ge6p@user-it9mg3ge6p2 жыл бұрын
  • Ролик отличный! Но я ждал именно завершение выполнения асинхронного метода!)

    @psy_gamer@psy_gamer2 жыл бұрын
  • Спасибо за видео всё очень понятно объяснил!

    @astyd256@astyd2562 жыл бұрын
  • Привет, спасибо за видео, познавательно! Но уже пора продолжение выкатывать:)) Как их грамотно завершать и как вообще их лучше использовать, кейсы

    @samserious5483@samserious5483 Жыл бұрын
  • Топ. Спасибо большое!

    @user-jz6cq2gp8z@user-jz6cq2gp8z2 жыл бұрын
  • Очень полезный урок. Спасибо!

    @Fenix72rus@Fenix72rus2 жыл бұрын
    • Жду урок про остановку

      @Fenix72rus@Fenix72rus2 жыл бұрын
  • Если Task.Yield не равен deltaTime, то как это поправить?

    @ilya1639@ilya16397 ай бұрын
  • Да, паттерны это хорошо. Видео хорошие. Было бы больше подписчиков)

    @PS-vj6jz@PS-vj6jz Жыл бұрын
  • Класс но тема сисек не раскрыта, нужно продолжение👍

    @def6141@def61412 жыл бұрын
  • А что за плагин показывает имена переменных в вызове функций? Платный?

    @ivanfilatov5482@ivanfilatov54827 ай бұрын
  • можете сделать видео про UniTask? На собеседованиях несколько раз спрашивали про них, а инфы немного

    @xagent@xagent11 ай бұрын
  • Я конечно не эксперт, но не понял чем же это лучше корутинов (код явно не стал проще и меньше)

    @user-ml5tn8qn8j@user-ml5tn8qn8j2 жыл бұрын
  • Не понял только как происходит работа с Monobehaviour из других потоков. Почему код работает?

    @shtolyan@shtolyan Жыл бұрын
    • Потому что это на самом деле не многопоточность в прямом смысле слова. Это "многопоточность". Я зря об этом не упомянул, но это специальный юнитевский async/await, который имитирует многопоточность, но на самом деле работает в основном потоке юнити. Так называемый синтаксический сахар. Грубо говоря, чтобы заменить костыльные корутины, добавили костыльный async/await

      @gamedevlavka@gamedevlavka Жыл бұрын
  • async/await не многопоточный. Проверить потоки можно выведя в лог id текущего потока в котором работает метод Thread.CurrentThread.ManagedThreadId

    @luckyrider1@luckyrider12 жыл бұрын
  • В документации написано, что когда в процедуре встречается await, то компилятор способен понять, что она асинхронная. Модификатор async был введен лишь для поддержки кода до 5 версии C#, чтобы разрешенные тогда идентификаторы await в таком коде продолжили работать. Типа теперь async однозначно приказывает компилятору воспринимать await как ключевое слово, а не идентификатор.

    @user-qb8lx2uq5j@user-qb8lx2uq5j2 жыл бұрын
  • Самый главный вопрос: когда ждать продолжение про async await?

    @AndreyDioX2000@AndreyDioX20002 жыл бұрын
    • Скоро)

      @gamedevlavka@gamedevlavka2 жыл бұрын
  • Большое спасибо! Жаль без подробностей про Task.Yield и завершение вторичных потоков в Unity...

    @kitws@kitws2 жыл бұрын
    • Будет в отдельном видео

      @gamedevlavka@gamedevlavka2 жыл бұрын
  • Корутины, о которых говорилось в видео. kzhead.info/sun/nsdmYryXf5-qiIU/bejne.htmlsi=ITXyG8o6cduPK86d

    @user-hk7qf9wl1m@user-hk7qf9wl1m8 ай бұрын
  • Я понимаю, что видео вышло год назад, но вдруг. Есть вопрос по поводу использования этого метода. Я реализовываю кликер, где по нажатию на кнопку улучшения начинают автоматически начисляться очки, для этого использую как раз асинк эвейт, но если на ту же кнопку нажать снова, то счетчик прибавляется очень неравномерно. Таск дэлей у меня секунда. При первом нажатии раз в секунду начисление. При втором и последующих нажатиях получается совсем не секунда, а как-то прерывисто. Может, кто-то подскажет, в какую сторону думать

    @mistertwink@mistertwink6 ай бұрын
    • Похоже у тебя запускается ещё одна процедура, когда ещё первая работает, нужна проверка

      @gamedevlavka@gamedevlavka6 ай бұрын
    • @@gamedevlavka ого, спасибо за ответ. Наверняка так и есть, потому что асинхронный метод вызывается заново, как я понимаю. Но к сожалению не понимаю, как остановить первый метод и тут же снова запустить его с уже новыми значениями переменных...

      @mistertwink@mistertwink6 ай бұрын
  • Уже год прошел, а видео с продолжением этой темы так и не появилось(

    @toxicknight3079@toxicknight3079 Жыл бұрын
  • Это ж копия видео Tarodev по сути, не похоже на вас. Стоило бы добавить, что стандартный async/await может и замена корутинам, но только в разовых операциях, на потоке он в несколько десятков раз медленнее и нужно использовать оптимизированный uniTask

    @CiTRyS32@CiTRyS322 жыл бұрын
    • Да, я изучал эту тему с разных сторон, и Tarodev привёл отличные примеры, в плане понятности. Не скажу, что сделать копию было намеренным действием, скорее его видео слишком на меня повлияло и так вышло. Да, там стоит добавить многое, и это будет в будущих видеороликах. В т.ч. UniTask, например, и тонкости работы юнитековского асинхронного кода

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • Что-то сомнительно, что нативный async/await медленнее корутин. Как раз наоборот должно быть, корутины это костыль, имитирующий асинхронность, пока юнити не поддерживал async в C#. Где можно про это узнать подробнее? Я погуглил и не нашел ничего про "медленнее в десятки раз".

      @user-qb8lx2uq5j@user-qb8lx2uq5j2 жыл бұрын
    • @@user-qb8lx2uq5j Держи kzhead.info/sun/msejY8-cfZNnaYE/bejne.html

      @CiTRyS32@CiTRyS322 жыл бұрын
    • @@CiTRyS32 Спасибо за ролик, интересный канал. Но по-моему, здесь что-то не то с тестом, или конкретная версия юнити криво реализовывала async C#. Надо перепроверять. К тому же даже в этом тесте оптимизированный async быстрее корутин.

      @user-qb8lx2uq5j@user-qb8lx2uq5j2 жыл бұрын
    • @@user-qb8lx2uq5j причем тут юнити и c#? Да, может в c# 9.0 оптимизировали асинхронщину, нужно актуализировать тест, но то, что "оптимизированный async быстрее корутин" никак не противоречит тому, что я вначале написал, ты путаешь горячее с теплым. В ролике на этом канале об оптимизации нет ни слова, а в тех тестах оптимизированная версия строится на том же UniTask P.S. Мне то пофиг, можешь пользоваться чем хочешь, но когда дело дойдет до публикации, например, на Itch.io и ты будешь билдить под веб, ни один твой дефолтный asynk/await не будет работать и тебе в любом случае придется изучать юнитаски или другие фреймворки на структурах

      @CiTRyS32@CiTRyS322 жыл бұрын
  • Не хорошо воровать видео с других каналов) kzhead.info/sun/ir1mnc9lkXl3pHA/bejne.html

    @bakiworld8025@bakiworld8025 Жыл бұрын
  • Есть продолжение?

    @thebiggestdick69@thebiggestdick695 ай бұрын
    • Я правильно понимаю что чтобы избежать выполнения асинхронных методов после завершения игры нужно каждый раз проверять работает ли еще приложение?

      @thebiggestdick69@thebiggestdick695 ай бұрын
KZhead