Тёмный

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

Максим Крюков
Подписаться 17 тыс.
Просмотров 27 тыс.
50% 1

Опубликовано:

 

25 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 103   
@АльбертАвагян-м9т
@АльбертАвагян-м9т 3 года назад
Спасибо большое за видео. Лучший канал по "подкопотной" юнити, да и юнити в целом
@lomion46
@lomion46 3 года назад
Огромная благодарность за разбор потрохов движка. Очень и очень интересовала вся подноготная от непосредственно работающего со всем этим, а не просто развлекательный контент.
@leksaysdevelopment7423
@leksaysdevelopment7423 3 года назад
Кайфовый видос ! Спасибо что делишься опытом и даешь инфу по теме в сжатом формате, не размазывая инфу на 100 видосов. По поводоу IEnumerator в MonoBehaviour функциях. Если ты работаешь с VR, то для того, чтобы начать работать с инпутом от рук, нужно, чтобы шлем их нашел. А это зависит от юзера, который может показать или спрятать руки от камер шлема, и от того, насколько быстро шлем найдет и передаст в игру данные о руках. Получается, если тебе нужно инициализировать какой-то класс в Start с использованием данных от рук (кости пальцев, позиция рук и т.д.), то нужно подождать, пока шлем передаст данные о руках. Вот в таком случае я использую IEnumerator Start(). Можно, конечно, это все раскидать на 2 метода и делать условия, но вроде проще все сделать в старте.
@gaitavr1992
@gaitavr1992 3 года назад
Да, старт бывает удобен для этого
@behappianstudio3576
@behappianstudio3576 3 года назад
Круто! Пошёл юзать Invoke! Как всегда ничего не понял))) Но это мои личные проблемы! Спасибо за ваш труд, надеюсь, скоро я преисполнюсь!
@luckyjava6588
@luckyjava6588 3 года назад
Попробуй Invoke в корутине, вызываемой в Invoke!
@gaitavr1992
@gaitavr1992 3 года назад
Смотрел видео emerald powder? Оно даст старт
@behappianstudio3576
@behappianstudio3576 3 года назад
@@gaitavr1992 Порой сложно переучиваться с чего-то, особенно, если не собираешься становиться в этом деле профи. Меня научили пользоваться корутинами только как таймерами, а дальше уже как пойдёт. Поэтому без желания даже смысла не вижу))) Просто стараюсь из каждого вашего видео брать что-то полезное по стилистике и по структуре. Ну и слушать главное, мало ли усвою!
@SowilTM
@SowilTM 3 года назад
Спасибо, Максим. Очень качественная и понятная подача информации, продолжай в том же духе.
@НазарГуртов-е5б
@НазарГуртов-е5б 3 года назад
Спасибо за контент, дядь)
@easycodeunity3d14
@easycodeunity3d14 2 года назад
Знай я это вчера, наверняка прошел бы собес в одну именнитую компанию )) Крутой канал, очень много полезного
@MrWatchmanLP
@MrWatchmanLP 3 года назад
Спасибо за видео!
@donbolshoff8965
@donbolshoff8965 2 года назад
Офигенский ролик, Спасибо!
@petrosaslanidis
@petrosaslanidis 3 года назад
Спасибо , как всегда занимательно.
@СергейПясковский-л3ъ
Огромное спасибо за видео и отдельно за ответ на просьбу. Подобных видео должно быть побольше в Ютубе. 👍 p.s. ответ я знал, но вряд-ли так рассказал.
@gaitavr1992
@gaitavr1992 3 года назад
Что-то за последние месяца на моей памяти 4 канала перестали выпускать видео. Brackeys, Flatingo, Emerald Powder, insane One. Наверное площадки другие нашли или приоритеты поменялись
@СергейПясковский-л3ъ
@@gaitavr1992 Да, я смотрел их, но теперь смотрю твой канал.
@AlexStraga
@AlexStraga 3 года назад
@@gaitavr1992 Бреки к сожалению все, так и сказали. Остальные видимо либо заняты, либо подустали. Себастьян вон тоже не часто выпускает видосы.
@illia_ryzhii
@illia_ryzhii Год назад
​@@gaitavr1992 Дуже чекаю на ваші нові відео, повертайтесь скоріше(
@ИгрушкиИльюшки
@ИгрушкиИльюшки 3 года назад
Отлично и понятно. Спасибо.
@daniilparokonnyy7980
@daniilparokonnyy7980 3 года назад
WaitUntil теперь всегда буду юзать для отслеживания нажатия клавиш)
@ruslan_yefimov
@ruslan_yefimov 2 года назад
Надеюсь, не для управления..
@DmitryTimofeev_general
@DmitryTimofeev_general 3 года назад
Был, смотрел, норм.
@ИгрушкиИльюшки
@ИгрушкиИльюшки 3 года назад
Кто бы сомневался)
@vladimircuraciov
@vladimircuraciov 3 года назад
Спасибо огромное!
@qwertysalo8665
@qwertysalo8665 3 года назад
Спасибо
@artursveshnikov7668
@artursveshnikov7668 3 года назад
Ваще не понятно, но очень интересно)) Я так понимаю в dotnet вообще такой проблемы нет. Всегда пользовался async/await и он более чем справляется. Слышал, что корутины в котлине есть, а оказывается у соседей по цеху из юнити тоже)
@gaitavr1992
@gaitavr1992 3 года назад
Принцип работы слишком разный у этих двух инструментов. Когда появилась корутина - юнити не поддерживала шарп с тасками
@Diyozen
@Diyozen 3 года назад
Очень круто!
@jugo-stream
@jugo-stream 3 года назад
Возьми меня в ученики 🙌 Мастер
@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”
@MoronicSoul
@MoronicSoul 13 дней назад
ни чего не понял, обедал - смотрел. норм)
@artemartem1235
@artemartem1235 4 месяца назад
Надо обязательно упомянуть, что таски не останавливаются при выходе из плеймода
@АнатолийПетрович-э8ч
Я давно весь свой код переписал на асинхронку, пропали задержки при выполнении логики. Отличная вещь, если правильно пользоваться. А корутинами вовсе перестал пользоваться. Но, если делать это неумело, на асинхронках можно легко забить память и время процессора. Корутины в этом плане кажутся более безопасными. А чтобы асинхронный метод уничтожался вместе с обьектом и высвобождал память, я обычно делаю внешний bool, и подвязываю проверку bool внутри класса к OnDestroy и внутри асинхронного метода, после инициализации в классе OnDestroy меняю значения bool и асинхроннй метод уничтожается вместе с текущим классом куда он подвязан. Таким образом асинхронный метод при такой реализации никогда не останется в памяти после уничтожения обьекта\класса, и будет уничтожаться вместе с ним. И тогда можно не передавать в каждую асинхронную функцию токен на уничтожение, просто сделав его глобальным в текущем классе. Тоже как вариант реализации. Так же глобальный bool можно связать и с другими ключевыми событиями в классе MonoBehaviour, если это будет необходимо, например еще с OnDisable, чтобы при отключении обьекта, асинхронный код так же "уничтожался". Такой подход избавит от того, чтобы вручную прописывать уничтожение асинхронного метода как на 14:28 Но, тут еще зависит и от конкретных задач наверно, где то возможно быстрее будет написать код из примера на видео.
@alexkokarew1574
@alexkokarew1574 2 года назад
Захотелось сделать игру про павука, который пуляется корутиной. XD
@ruslan_yefimov
@ruslan_yefimov 2 года назад
ага, сделать каждую паутину реально корутиной xd
@4elowww742
@4elowww742 5 месяцев назад
Я использовал корутин зацикленный с методом
@akstis4183
@akstis4183 3 года назад
Никто почему-то не написал, почему при вызове корутины потеряется кадр. А потеряется он потому, что update вызывается раньше чем вызовется корутина?
@grimseal
@grimseal 3 года назад
Тоже не понял этот момент, т.к. до этого автор говорит что при старте корутины она сразу до первой yield инструкции отрабатыват
@gaitavr1992
@gaitavr1992 3 года назад
Попробуйте написать код с дебагом. Один дебаг после старта корутины, один внутри до yield return null, и один после
@rednecksstudio3207
@rednecksstudio3207 3 года назад
Спасибо за видео, очень приятно что ты берёшь углублённый уровень за основу в видео. Хотел вкинуть идею на счёт паттерна Singleton, в обществе много дискуссий на тему этого паттерна. Можешь рассказать о его плюсах, минусах и чем чревато его использование в коде, или же как его правильно правильно использовать.
@YooPita
@YooPita 3 года назад
Синглтон это не паттерн, а скорее вредная практика, если мы условились, что прогаем в ООП, потому что это тупо нарушает его принципы. Если тебе нужен контейнер для хранения данных, то создай его и ссылайся на него, если нужны методы не требующие создания объекта используй статик. И учись описывать объекты без "Controller" или "GameManager". Твой вопрос не про синглтон, а про ООП, изучи ООП, научись мыслить в его парадигмах и тогда вопрос про функциональный синглтон отпадёт сам по себе.
@YooPita
@YooPita 3 года назад
@Гоша Ватюнга Создавать целый класс и называть его Mathf это вообще пиздец. Равняться на говнокод юнити это не правильно. Математика не может быть объектом, это скорее пространство имён, которое содержит набор статических классов вроде Abs, Sin и т.д. Ну это если говорить о том, как на самом деле обстоят дела с ООП в юнити. А так логика верная "всё что имеет состояние не должно быть статик". Только синглтон это статик который хочет иметь состояние.
@ruslan_yefimov
@ruslan_yefimov 2 года назад
@@YooPita Если погуглить мнение ведущих разрабов в отрасли, то ООП нужно далеко не везде и не всегда - много где понятней и короче писать синглтоны и то, что вы назвали говнокодом) ООП зачастую невозможно применить в коде, только вот на то это и парадигма - всего лишь набор концепций и правил, а не правда в последней инстанции
@Котвбезумнойшляпе
Прям уровень Университета))
@YooPita
@YooPita 3 года назад
Не то слово. Я даже законспектировал некоторые моменты из ролика в тетрадь.
@ruslan_yefimov
@ruslan_yefimov 2 года назад
Даже лучше..
@ИванДерябкин-ц3д
@ИванДерябкин-ц3д 2 года назад
Корутина всегда теряет 1 кадр, потому что, после того как мы дошли до yield инструкции проверка на isDone вызовется только в след кадре, и только после нее мы перейдем к блоку кода после yield инструкции. Правильно ?
@gaitavr1992
@gaitavr1992 2 года назад
Да
@semenshchepkin1333
@semenshchepkin1333 Год назад
Максим, привет! спасибо за видео. всё изложенное понятно, однако, есть вопрос в контексте Task VS Coroutine: я только начал знакомство с юнити (есть опыт в бэкэнде), и сразу встрял с тасками - мой код прекрасно работает в редакторе и в скомпилированной для десктопа версии, но в браузере - нет. я вычитал, что таски вообще не поддерживаются в WebGL из-за однопоточности js. правильно ли я понял, что для браузерных игр мой единственный выход - писать всё на корутинах? если да, я обескуражен, и мне кажется, что это критически важный момент, который необходимо явно проговаривать в подобных видео)
@Xa4_Xakum
@Xa4_Xakum Год назад
прошу передать спасибо Роману Сакутину за совет перейти на этот канал)
@YasnaKo
@YasnaKo 3 года назад
На мой взгляд видео Emerald Powder нужно смотреть после этого. Я перечитала с десяток-другой статей/видео по теме, но почему-то в первый раз встретила такую простую но наглядную схему, поясняющую, чем же корутина отличается от обычной функции и что это такое. А примеры использования в мою голову не ложатся, пока я не пойму, что это вообще такое.
@YasnaKo
@YasnaKo 3 года назад
Хех, если в прошлый подход к корутинам было понятно процентов 5, то теперь уже около 20, кайф)
@aibaster
@aibaster 3 года назад
Интересное видео. Спасибо за контент. Вопрос. Будут ли записаны видео по WPF к примеру?Не только по юнити(паттерны,работы джунов) же контент делать)
@gaitavr1992
@gaitavr1992 3 года назад
Из не юнити планируется только ASP.NET, но там скорее опыт использования с пониманием того, что я далеко не опытный в этом деле. Java и Objective C в контексте плагинов тоже наверняка будут. WPF мне не зачем
@aibaster
@aibaster 3 года назад
@@gaitavr1992 и то хорошо. Спасибо
@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 года назад
Разница в одном потоке
@5hillsgames470
@5hillsgames470 3 года назад
Максим, как можно с вами связаться? Есть предложение по работе
@gaitavr1992
@gaitavr1992 3 года назад
Я не заинтересован в дополнительной работе
@AleksYurchenko
@AleksYurchenko Год назад
Почему бы не сказать сопрограмма? Coroutine это сопрограмма.
@lkghost7
@lkghost7 3 года назад
только вот является ли карутина по факту асинхронной, можно ли ее так называть
@ruslan_yefimov
@ruslan_yefimov 2 года назад
асинхронная, если вызвать её через таску)
@NoldoWalker
@NoldoWalker 3 года назад
1 - 4 - (если нажмут на пробел) - 5 - 2 - 3
@evgenkonyshock4913
@evgenkonyshock4913 3 года назад
Там keyUp используется, так что тут вернее будет "если не нажмут на пробел")
@TheTempterable
@TheTempterable 3 года назад
@@evgenkonyshock4913 Еще вернее будет, если пробел был нажат, но в этот момент его отпустили
@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 года назад
да, он в видео потом циферки поменял как оно будет.
@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 3 месяца назад
фу одноядерный кот
@inatesi
@inatesi 2 года назад
1 4 5 2 3
Далее
Avaz Oxun - Turqi sovuq kal
14:50
Просмотров 656 тыс.
Истории с сестрой (Сборник)
38:16
Как он понял?
00:13
Просмотров 50 тыс.
Паттерн состояние в unity 3D
12:40
Просмотров 21 тыс.
Всё про корутины в Unity 3D
13:18
Просмотров 102 тыс.
Avaz Oxun - Turqi sovuq kal
14:50
Просмотров 656 тыс.