No video

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

  Рет қаралды 27,048

Максим Крюков

Максим Крюков

Күн бұрын

Пікірлер: 102
@user-bc4me5kz7j
@user-bc4me5kz7j 3 жыл бұрын
Спасибо большое за видео. Лучший канал по "подкопотной" юнити, да и юнити в целом
@lomion46
@lomion46 3 жыл бұрын
Огромная благодарность за разбор потрохов движка. Очень и очень интересовала вся подноготная от непосредственно работающего со всем этим, а не просто развлекательный контент.
@SowilTM
@SowilTM 3 жыл бұрын
Спасибо, Максим. Очень качественная и понятная подача информации, продолжай в том же духе.
@user-wg5rf8xp3p
@user-wg5rf8xp3p 3 жыл бұрын
Спасибо за контент, дядь)
@behappianstudio3576
@behappianstudio3576 3 жыл бұрын
Круто! Пошёл юзать Invoke! Как всегда ничего не понял))) Но это мои личные проблемы! Спасибо за ваш труд, надеюсь, скоро я преисполнюсь!
@luckyjava6588
@luckyjava6588 3 жыл бұрын
Попробуй Invoke в корутине, вызываемой в Invoke!
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Смотрел видео emerald powder? Оно даст старт
@behappianstudio3576
@behappianstudio3576 3 жыл бұрын
@@gaitavr1992 Порой сложно переучиваться с чего-то, особенно, если не собираешься становиться в этом деле профи. Меня научили пользоваться корутинами только как таймерами, а дальше уже как пойдёт. Поэтому без желания даже смысла не вижу))) Просто стараюсь из каждого вашего видео брать что-то полезное по стилистике и по структуре. Ну и слушать главное, мало ли усвою!
@leksaysdevelopment7423
@leksaysdevelopment7423 3 жыл бұрын
Кайфовый видос ! Спасибо что делишься опытом и даешь инфу по теме в сжатом формате, не размазывая инфу на 100 видосов. По поводоу IEnumerator в MonoBehaviour функциях. Если ты работаешь с VR, то для того, чтобы начать работать с инпутом от рук, нужно, чтобы шлем их нашел. А это зависит от юзера, который может показать или спрятать руки от камер шлема, и от того, насколько быстро шлем найдет и передаст в игру данные о руках. Получается, если тебе нужно инициализировать какой-то класс в Start с использованием данных от рук (кости пальцев, позиция рук и т.д.), то нужно подождать, пока шлем передаст данные о руках. Вот в таком случае я использую IEnumerator Start(). Можно, конечно, это все раскидать на 2 метода и делать условия, но вроде проще все сделать в старте.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Да, старт бывает удобен для этого
@easycodeunity3d14
@easycodeunity3d14 2 жыл бұрын
Знай я это вчера, наверняка прошел бы собес в одну именнитую компанию )) Крутой канал, очень много полезного
@rednecksstudio3207
@rednecksstudio3207 3 жыл бұрын
Спасибо за видео, очень приятно что ты берёшь углублённый уровень за основу в видео. Хотел вкинуть идею на счёт паттерна Singleton, в обществе много дискуссий на тему этого паттерна. Можешь рассказать о его плюсах, минусах и чем чревато его использование в коде, или же как его правильно правильно использовать.
@YooPita
@YooPita 3 жыл бұрын
Синглтон это не паттерн, а скорее вредная практика, если мы условились, что прогаем в ООП, потому что это тупо нарушает его принципы. Если тебе нужен контейнер для хранения данных, то создай его и ссылайся на него, если нужны методы не требующие создания объекта используй статик. И учись описывать объекты без "Controller" или "GameManager". Твой вопрос не про синглтон, а про ООП, изучи ООП, научись мыслить в его парадигмах и тогда вопрос про функциональный синглтон отпадёт сам по себе.
@YooPita
@YooPita 2 жыл бұрын
@Гоша Ватюнга Создавать целый класс и называть его Mathf это вообще пиздец. Равняться на говнокод юнити это не правильно. Математика не может быть объектом, это скорее пространство имён, которое содержит набор статических классов вроде Abs, Sin и т.д. Ну это если говорить о том, как на самом деле обстоят дела с ООП в юнити. А так логика верная "всё что имеет состояние не должно быть статик". Только синглтон это статик который хочет иметь состояние.
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
@@YooPita Если погуглить мнение ведущих разрабов в отрасли, то ООП нужно далеко не везде и не всегда - много где понятней и короче писать синглтоны и то, что вы назвали говнокодом) ООП зачастую невозможно применить в коде, только вот на то это и парадигма - всего лишь набор концепций и правил, а не правда в последней инстанции
@donbolshoff8965
@donbolshoff8965 2 жыл бұрын
Офигенский ролик, Спасибо!
@user-rh8ut2lf8o
@user-rh8ut2lf8o 3 жыл бұрын
Огромное спасибо за видео и отдельно за ответ на просьбу. Подобных видео должно быть побольше в Ютубе. 👍 p.s. ответ я знал, но вряд-ли так рассказал.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Что-то за последние месяца на моей памяти 4 канала перестали выпускать видео. Brackeys, Flatingo, Emerald Powder, insane One. Наверное площадки другие нашли или приоритеты поменялись
@user-rh8ut2lf8o
@user-rh8ut2lf8o 3 жыл бұрын
@@gaitavr1992 Да, я смотрел их, но теперь смотрю твой канал.
@AlexStraga
@AlexStraga 3 жыл бұрын
@@gaitavr1992 Бреки к сожалению все, так и сказали. Остальные видимо либо заняты, либо подустали. Себастьян вон тоже не часто выпускает видосы.
@illia_ryzhii
@illia_ryzhii Жыл бұрын
​@@gaitavr1992 Дуже чекаю на ваші нові відео, повертайтесь скоріше(
@petrosaslanidis
@petrosaslanidis 3 жыл бұрын
Спасибо , как всегда занимательно.
@MrWatchmanLP
@MrWatchmanLP 3 жыл бұрын
Спасибо за видео!
@user-nm5zh2zb8c
@user-nm5zh2zb8c 3 жыл бұрын
Отлично и понятно. Спасибо.
@daniilparokonnyy7980
@daniilparokonnyy7980 3 жыл бұрын
WaitUntil теперь всегда буду юзать для отслеживания нажатия клавиш)
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
Надеюсь, не для управления..
@Diyozen
@Diyozen 3 жыл бұрын
Очень круто!
@artursveshnikov7668
@artursveshnikov7668 2 жыл бұрын
Ваще не понятно, но очень интересно)) Я так понимаю в dotnet вообще такой проблемы нет. Всегда пользовался async/await и он более чем справляется. Слышал, что корутины в котлине есть, а оказывается у соседей по цеху из юнити тоже)
@gaitavr1992
@gaitavr1992 2 жыл бұрын
Принцип работы слишком разный у этих двух инструментов. Когда появилась корутина - юнити не поддерживала шарп с тасками
@DmitryTimofeev_general
@DmitryTimofeev_general 3 жыл бұрын
Был, смотрел, норм.
@user-nm5zh2zb8c
@user-nm5zh2zb8c 3 жыл бұрын
Кто бы сомневался)
@akstis4183
@akstis4183 3 жыл бұрын
Никто почему-то не написал, почему при вызове корутины потеряется кадр. А потеряется он потому, что update вызывается раньше чем вызовется корутина?
@grimseal
@grimseal 2 жыл бұрын
Тоже не понял этот момент, т.к. до этого автор говорит что при старте корутины она сразу до первой yield инструкции отрабатыват
@gaitavr1992
@gaitavr1992 2 жыл бұрын
Попробуйте написать код с дебагом. Один дебаг после старта корутины, один внутри до yield return null, и один после
@jugo-stream
@jugo-stream 3 жыл бұрын
Возьми меня в ученики 🙌 Мастер
@vladimircuraciov
@vladimircuraciov 3 жыл бұрын
Спасибо огромное!
@artemartem1235
@artemartem1235 3 ай бұрын
Надо обязательно упомянуть, что таски не останавливаются при выходе из плеймода
@qwertysalo8665
@qwertysalo8665 3 жыл бұрын
Спасибо
@user-uk9pv6bx7z
@user-uk9pv6bx7z 3 жыл бұрын
Я давно весь свой код переписал на асинхронку, пропали задержки при выполнении логики. Отличная вещь, если правильно пользоваться. А корутинами вовсе перестал пользоваться. Но, если делать это неумело, на асинхронках можно легко забить память и время процессора. Корутины в этом плане кажутся более безопасными. А чтобы асинхронный метод уничтожался вместе с обьектом и высвобождал память, я обычно делаю внешний bool, и подвязываю проверку bool внутри класса к OnDestroy и внутри асинхронного метода, после инициализации в классе OnDestroy меняю значения bool и асинхроннй метод уничтожается вместе с текущим классом куда он подвязан. Таким образом асинхронный метод при такой реализации никогда не останется в памяти после уничтожения обьекта\класса, и будет уничтожаться вместе с ним. И тогда можно не передавать в каждую асинхронную функцию токен на уничтожение, просто сделав его глобальным в текущем классе. Тоже как вариант реализации. Так же глобальный bool можно связать и с другими ключевыми событиями в классе MonoBehaviour, если это будет необходимо, например еще с OnDisable, чтобы при отключении обьекта, асинхронный код так же "уничтожался". Такой подход избавит от того, чтобы вручную прописывать уничтожение асинхронного метода как на 14:28 Но, тут еще зависит и от конкретных задач наверно, где то возможно быстрее будет написать код из примера на видео.
@nwsx357
@nwsx357 3 жыл бұрын
хорошее видео, но я заметил одну неточность. у вас на канале в названии каждого видео написано «unity3d», а на самом деле движек называется просто «unity». Если просто вдруг кто спросит - будешь знать ыы. шутка. канал занятный. я новый подписчик ы
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Откуда пришел? Фейсбук, контакт или что-то еще? Чисто для статистики)
@andrewmolotkoff4231
@andrewmolotkoff4231 3 жыл бұрын
@@gaitavr1992 по стилю коммента понятно, что от сакутина
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
Если начал кодить на той неделе, то конечно Unity, но раньше была приписка 3d)
@nwsx357
@nwsx357 2 жыл бұрын
@@ruslan_yefimov а ты походу учил по этим высерам и теперь не знаешь как движек называется. скачай любую версию за любой год из архива и посмотри окно “about”
@alexkokarew1574
@alexkokarew1574 2 жыл бұрын
Захотелось сделать игру про павука, который пуляется корутиной. XD
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
ага, сделать каждую паутину реально корутиной xd
@user-jx7pc9ku7b
@user-jx7pc9ku7b 3 жыл бұрын
Прям уровень Университета))
@YooPita
@YooPita 3 жыл бұрын
Не то слово. Я даже законспектировал некоторые моменты из ролика в тетрадь.
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
Даже лучше..
@semenshchepkin1333
@semenshchepkin1333 Жыл бұрын
Максим, привет! спасибо за видео. всё изложенное понятно, однако, есть вопрос в контексте Task VS Coroutine: я только начал знакомство с юнити (есть опыт в бэкэнде), и сразу встрял с тасками - мой код прекрасно работает в редакторе и в скомпилированной для десктопа версии, но в браузере - нет. я вычитал, что таски вообще не поддерживаются в WebGL из-за однопоточности js. правильно ли я понял, что для браузерных игр мой единственный выход - писать всё на корутинах? если да, я обескуражен, и мне кажется, что это критически важный момент, который необходимо явно проговаривать в подобных видео)
@YasnaKo
@YasnaKo 3 жыл бұрын
На мой взгляд видео Emerald Powder нужно смотреть после этого. Я перечитала с десяток-другой статей/видео по теме, но почему-то в первый раз встретила такую простую но наглядную схему, поясняющую, чем же корутина отличается от обычной функции и что это такое. А примеры использования в мою голову не ложатся, пока я не пойму, что это вообще такое.
@YasnaKo
@YasnaKo 3 жыл бұрын
Хех, если в прошлый подход к корутинам было понятно процентов 5, то теперь уже около 20, кайф)
@user-ct3pn9ib6f
@user-ct3pn9ib6f 2 жыл бұрын
Корутина всегда теряет 1 кадр, потому что, после того как мы дошли до yield инструкции проверка на isDone вызовется только в след кадре, и только после нее мы перейдем к блоку кода после yield инструкции. Правильно ?
@gaitavr1992
@gaitavr1992 2 жыл бұрын
Да
@Xa4_Xakum
@Xa4_Xakum Жыл бұрын
прошу передать спасибо Роману Сакутину за совет перейти на этот канал)
@aibaster
@aibaster 3 жыл бұрын
Интересное видео. Спасибо за контент. Вопрос. Будут ли записаны видео по WPF к примеру?Не только по юнити(паттерны,работы джунов) же контент делать)
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Из не юнити планируется только ASP.NET, но там скорее опыт использования с пониманием того, что я далеко не опытный в этом деле. Java и Objective C в контексте плагинов тоже наверняка будут. WPF мне не зачем
@aibaster
@aibaster 3 жыл бұрын
@@gaitavr1992 и то хорошо. Спасибо
@4elowww742
@4elowww742 4 ай бұрын
Я использовал корутин зацикленный с методом
@andreypan1608
@andreypan1608 2 жыл бұрын
как сказал: Они являются полностью противоположными для удобного использования. 😁 что хотел сказать: Они являются полностью противоположными. Поэтому они удобны.
@BulatBulatov
@BulatBulatov 2 жыл бұрын
Подписался
@Pravda-bw3tj
@Pravda-bw3tj 3 жыл бұрын
так и не понял, а что по оптимизации, что выгоднее использовать
@vladoscrafter5117
@vladoscrafter5117 3 жыл бұрын
Максим, хотел бы узнать, есть ли какая-то возможность создать хорошую Стейт машину не базируясь на патерне стратегия? Очень часто задаю себе этот вопрос, но достойного решения так и не нашел(
@gaitavr1992
@gaitavr1992 3 жыл бұрын
А что не так в стратегии?
@CTePeoTun
@CTePeoTun 3 жыл бұрын
Ну и логичный вопрос, если у асинхронных методов больше преимуществ, то зачем юзать корутины? Не считая момента, что при разрушении объекта нужно прерывать асинхронный метод. Но наверняка с этим можно что-то придумать.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
С тасками невозможно привязаться к юнити ивентам(апдейт, рендеринг и тд). Плюс таска тяжелее в продолжении, когда вызывается метод пост в контекст, из которого была пауза
@koishigarin
@koishigarin 3 жыл бұрын
​@@gaitavr1992 А что скажете про UniTask? Там вроде идентично практически всё со стандартными async/await и привязка к player loop есть.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Разница в одном потоке
@AleksYurchenko
@AleksYurchenko Жыл бұрын
Почему бы не сказать сопрограмма? Coroutine это сопрограмма.
@5hillsgames470
@5hillsgames470 2 жыл бұрын
Максим, как можно с вами связаться? Есть предложение по работе
@gaitavr1992
@gaitavr1992 2 жыл бұрын
Я не заинтересован в дополнительной работе
@lkghost7
@lkghost7 3 жыл бұрын
только вот является ли карутина по факту асинхронной, можно ли ее так называть
@ruslan_yefimov
@ruslan_yefimov 2 жыл бұрын
асинхронная, если вызвать её через таску)
@archon7th
@archon7th 3 жыл бұрын
запустил и забыл это Invoke(nameof(Method), magicNumber);
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Забудьте про этот метод. Его можно использовать только для прототипирования
@mimineko3100
@mimineko3100 3 жыл бұрын
@@gaitavr1992 ды ну? Это чего это? аргументы-то будут хоть какие-то? мало ли что кому-то он не нравится... но на нём всё отлично работает, адекватно и предсказуемо! в отличии от любых других альтернатив. Не нада так указывать людям, что им забывать, что не забывать, что применять и для чего. Это по меньшей мере, не корректно и самонадеяно. Единственный его минус - невозможность передачи параметров, но и это можно обойти.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Я бы посмотрел на ваш высокооптимизированный код в котором не разберешься без 100 грамм. Это отсылка еще к одному комментарию про ненужность корутин и тасок, свой таймер и тд. 80 процентов кода не чувствительно к оптимизации, а работа в команде очень важна всегда, чтобы любой мог прочитать и изменить чужой код
@archon7th
@archon7th 3 жыл бұрын
@@gaitavr1992 как по мне не сильно то и усложняющая. Достаточно помечать методы и не лепить их куда угодно при первой же возможности. А еще можно и к тестированию претензии предъявить ) Я так скажу, а "запутать колег" можно куда круче с помощь какого-нибудь визитера чем корутиной или инвоком.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Если коллеги пишут в императивном стиле, а слово паттерн вызывает ассоциацию с синглтоном, то вопросов нет
@Ruslon-oc3pt
@Ruslon-oc3pt 3 жыл бұрын
1,4,5,2,3?
@alekseigolub4336
@alekseigolub4336 3 жыл бұрын
да, он в видео потом циферки поменял как оно будет.
@NoldoWalker
@NoldoWalker 3 жыл бұрын
1 - 4 - (если нажмут на пробел) - 5 - 2 - 3
@evgenkonyshock4913
@evgenkonyshock4913 3 жыл бұрын
Там keyUp используется, так что тут вернее будет "если не нажмут на пробел")
@TheTempterable
@TheTempterable 3 жыл бұрын
@@evgenkonyshock4913 Еще вернее будет, если пробел был нажат, но в этот момент его отпустили
@eugenebahmatsky2552
@eugenebahmatsky2552 3 жыл бұрын
Круто удалять из листа во время фора! Проверяй код. Тебе надо тогда i не преращать, чтобы следующий элемент не проебать
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Первое предупреждение за мат, следом будет бан
@eugenebahmatsky2552
@eugenebahmatsky2552 3 жыл бұрын
@@gaitavr1992 не стоит. Лучше я отпишусь
@YouSitePro
@YouSitePro 3 жыл бұрын
@@gaitavr1992 , ))) Тебе указали на ошибку, в первую очередь. То, каким образом это сделано - уже второй вопрос.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Для меня это первый вопрос, когда проявляется открытое неуважение - внятного ответа не будет
@igroteka90
@igroteka90 Жыл бұрын
2:38 - не читабельным, а читаемым. Давайте говорить по-русски.
@gaitavr1992
@gaitavr1992 Жыл бұрын
Давайте на вихід з цього каналу і розказуйте десь в іншому місці
@rahatbakum7852
@rahatbakum7852 Жыл бұрын
@@gaitavr1992 лайййкк
@ivanfilatov5482
@ivanfilatov5482 2 ай бұрын
фу одноядерный кот
@inatesi
@inatesi 2 жыл бұрын
1 4 5 2 3
ООП вопросы на юнити собеседовании
14:11
Максим Крюков
Рет қаралды 43 М.
English or Spanish 🤣
00:16
GL Show
Рет қаралды 6 МЛН
Whoa
01:00
Justin Flom
Рет қаралды 31 МЛН
С++ ЗА 10 ЧАСОВ (25 минут вырезки)
25:51
Winderton
Рет қаралды 86 М.
Асинхронное программирование на C# (блок 1)
1:01:53
Просто программист
Рет қаралды 7 М.
Что такое корутины в Unity и как их использовать?
10:45
Руслан Смирнов • Game Development
Рет қаралды 814
Unity async / await: Coroutine's Hot Sister [C# & Unity]
16:18