Как писать асинхронный код в юнити. Корутины для продвинутых
В этом видео мы рассмотрим принцип работы корутин в юнити. Чем они отличаются от асинхронных методов и как зависят от цикла обновления юнити.
Ссылка на 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
Спасибо большое за видео. Лучший канал по "подкопотной" юнити, да и юнити в целом
Огромная благодарность за разбор потрохов движка. Очень и очень интересовала вся подноготная от непосредственно работающего со всем этим, а не просто развлекательный контент.
Спасибо за видео!
Спасибо за контент, дядь)
Отлично и понятно. Спасибо.
Спасибо , как всегда занимательно.
Спасибо, Максим. Очень качественная и понятная подача информации, продолжай в том же духе.
Спасибо огромное!
Офигенский ролик, Спасибо!
Спасибо
Очень круто!
Кайфовый видос ! Спасибо что делишься опытом и даешь инфу по теме в сжатом формате, не размазывая инфу на 100 видосов. По поводоу IEnumerator в MonoBehaviour функциях. Если ты работаешь с VR, то для того, чтобы начать работать с инпутом от рук, нужно, чтобы шлем их нашел. А это зависит от юзера, который может показать или спрятать руки от камер шлема, и от того, насколько быстро шлем найдет и передаст в игру данные о руках. Получается, если тебе нужно инициализировать какой-то класс в Start с использованием данных от рук (кости пальцев, позиция рук и т.д.), то нужно подождать, пока шлем передаст данные о руках. Вот в таком случае я использую IEnumerator Start(). Можно, конечно, это все раскидать на 2 метода и делать условия, но вроде проще все сделать в старте.
Да, старт бывает удобен для этого
Знай я это вчера, наверняка прошел бы собес в одну именнитую компанию )) Крутой канал, очень много полезного
Круто! Пошёл юзать Invoke! Как всегда ничего не понял))) Но это мои личные проблемы! Спасибо за ваш труд, надеюсь, скоро я преисполнюсь!
Попробуй Invoke в корутине, вызываемой в Invoke!
Смотрел видео emerald powder? Оно даст старт
@@gaitavr1992 Порой сложно переучиваться с чего-то, особенно, если не собираешься становиться в этом деле профи. Меня научили пользоваться корутинами только как таймерами, а дальше уже как пойдёт. Поэтому без желания даже смысла не вижу))) Просто стараюсь из каждого вашего видео брать что-то полезное по стилистике и по структуре. Ну и слушать главное, мало ли усвою!
Максим, привет! спасибо за видео. всё изложенное понятно, однако, есть вопрос в контексте Task VS Coroutine: я только начал знакомство с юнити (есть опыт в бэкэнде), и сразу встрял с тасками - мой код прекрасно работает в редакторе и в скомпилированной для десктопа версии, но в браузере - нет. я вычитал, что таски вообще не поддерживаются в WebGL из-за однопоточности js. правильно ли я понял, что для браузерных игр мой единственный выход - писать всё на корутинах? если да, я обескуражен, и мне кажется, что это критически важный момент, который необходимо явно проговаривать в подобных видео)
Огромное спасибо за видео и отдельно за ответ на просьбу. Подобных видео должно быть побольше в Ютубе. 👍 p.s. ответ я знал, но вряд-ли так рассказал.
Что-то за последние месяца на моей памяти 4 канала перестали выпускать видео. Brackeys, Flatingo, Emerald Powder, insane One. Наверное площадки другие нашли или приоритеты поменялись
@@gaitavr1992 Да, я смотрел их, но теперь смотрю твой канал.
@@gaitavr1992 Бреки к сожалению все, так и сказали. Остальные видимо либо заняты, либо подустали. Себастьян вон тоже не часто выпускает видосы.
@@gaitavr1992 Дуже чекаю на ваші нові відео, повертайтесь скоріше(
Спасибо за видео, очень приятно что ты берёшь углублённый уровень за основу в видео. Хотел вкинуть идею на счёт паттерна Singleton, в обществе много дискуссий на тему этого паттерна. Можешь рассказать о его плюсах, минусах и чем чревато его использование в коде, или же как его правильно правильно использовать.
Синглтон это не паттерн, а скорее вредная практика, если мы условились, что прогаем в ООП, потому что это тупо нарушает его принципы. Если тебе нужен контейнер для хранения данных, то создай его и ссылайся на него, если нужны методы не требующие создания объекта используй статик. И учись описывать объекты без "Controller" или "GameManager". Твой вопрос не про синглтон, а про ООП, изучи ООП, научись мыслить в его парадигмах и тогда вопрос про функциональный синглтон отпадёт сам по себе.
@@YooPita Статик это то же самое что и синглтон, нет разницы что использовать (если речь о сущности с состоянием). Думаю совет "изучи ООП и научись мыслить в его парадигмах" применим и к вам. Вообще статик используется только для чего-то вроде Unity.Mathf. Всё что имеет состояние не должно быть статик.
@@vatyunga Создавать целый класс и называть его Mathf это вообще пиздец. Равняться на говнокод юнити это не правильно. Математика не может быть объектом, это скорее пространство имён, которое содержит набор статических классов вроде Abs, Sin и т.д. Ну это если говорить о том, как на самом деле обстоят дела с ООП в юнити. А так логика верная "всё что имеет состояние не должно быть статик". Только синглтон это статик который хочет иметь состояние.
@@YooPita Если погуглить мнение ведущих разрабов в отрасли, то ООП нужно далеко не везде и не всегда - много где понятней и короче писать синглтоны и то, что вы назвали говнокодом) ООП зачастую невозможно применить в коде, только вот на то это и парадигма - всего лишь набор концепций и правил, а не правда в последней инстанции
Подписался
Интересное видео. Спасибо за контент. Вопрос. Будут ли записаны видео по WPF к примеру?Не только по юнити(паттерны,работы джунов) же контент делать)
Из не юнити планируется только ASP.NET, но там скорее опыт использования с пониманием того, что я далеко не опытный в этом деле. Java и Objective C в контексте плагинов тоже наверняка будут. WPF мне не зачем
@@gaitavr1992 и то хорошо. Спасибо
Возьми меня в ученики 🙌 Мастер
Был, смотрел, норм.
Кто бы сомневался)
WaitUntil теперь всегда буду юзать для отслеживания нажатия клавиш)
Надеюсь, не для управления..
Ваще не понятно, но очень интересно)) Я так понимаю в dotnet вообще такой проблемы нет. Всегда пользовался async/await и он более чем справляется. Слышал, что корутины в котлине есть, а оказывается у соседей по цеху из юнити тоже)
Принцип работы слишком разный у этих двух инструментов. Когда появилась корутина - юнити не поддерживала шарп с тасками
так и не понял, а что по оптимизации, что выгоднее использовать
Максим, хотел бы узнать, есть ли какая-то возможность создать хорошую Стейт машину не базируясь на патерне стратегия? Очень часто задаю себе этот вопрос, но достойного решения так и не нашел(
А что не так в стратегии?
прошу передать спасибо Роману Сакутину за совет перейти на этот канал)
Захотелось сделать игру про павука, который пуляется корутиной. XD
ага, сделать каждую паутину реально корутиной xd
Прям уровень Университета))
Не то слово. Я даже законспектировал некоторые моменты из ролика в тетрадь.
Даже лучше..
Никто почему-то не написал, почему при вызове корутины потеряется кадр. А потеряется он потому, что update вызывается раньше чем вызовется корутина?
Тоже не понял этот момент, т.к. до этого автор говорит что при старте корутины она сразу до первой yield инструкции отрабатыват
Попробуйте написать код с дебагом. Один дебаг после старта корутины, один внутри до yield return null, и один после
хорошее видео, но я заметил одну неточность. у вас на канале в названии каждого видео написано «unity3d», а на самом деле движек называется просто «unity». Если просто вдруг кто спросит - будешь знать ыы. шутка. канал занятный. я новый подписчик ы
Откуда пришел? Фейсбук, контакт или что-то еще? Чисто для статистики)
@@gaitavr1992 по стилю коммента понятно, что от сакутина
Если начал кодить на той неделе, то конечно Unity, но раньше была приписка 3d)
@@ruslan_yefimov а ты походу учил по этим высерам и теперь не знаешь как движек называется. скачай любую версию за любой год из архива и посмотри окно “about”
как сказал: Они являются полностью противоположными для удобного использования. 😁 что хотел сказать: Они являются полностью противоположными. Поэтому они удобны.
Максим, как можно с вами связаться? Есть предложение по работе
Я не заинтересован в дополнительной работе
На мой взгляд видео Emerald Powder нужно смотреть после этого. Я перечитала с десяток-другой статей/видео по теме, но почему-то в первый раз встретила такую простую но наглядную схему, поясняющую, чем же корутина отличается от обычной функции и что это такое. А примеры использования в мою голову не ложатся, пока я не пойму, что это вообще такое.
Хех, если в прошлый подход к корутинам было понятно процентов 5, то теперь уже около 20, кайф)
Корутина всегда теряет 1 кадр, потому что, после того как мы дошли до yield инструкции проверка на isDone вызовется только в след кадре, и только после нее мы перейдем к блоку кода после yield инструкции. Правильно ?
Да
Ну и логичный вопрос, если у асинхронных методов больше преимуществ, то зачем юзать корутины? Не считая момента, что при разрушении объекта нужно прерывать асинхронный метод. Но наверняка с этим можно что-то придумать.
С тасками невозможно привязаться к юнити ивентам(апдейт, рендеринг и тд). Плюс таска тяжелее в продолжении, когда вызывается метод пост в контекст, из которого была пауза
@@gaitavr1992 А что скажете про UniTask? Там вроде идентично практически всё со стандартными async/await и привязка к player loop есть.
Разница в одном потоке
Я давно весь свой код переписал на асинхронку, пропали задержки при выполнении логики. Отличная вещь, если правильно пользоваться. А корутинами вовсе перестал пользоваться. Но, если делать это неумело, на асинхронках можно легко забить память и время процессора. Корутины в этом плане кажутся более безопасными. А чтобы асинхронный метод уничтожался вместе с обьектом и высвобождал память, я обычно делаю внешний bool, и подвязываю проверку bool внутри класса к OnDestroy и внутри асинхронного метода, после инициализации в классе OnDestroy меняю значения bool и асинхроннй метод уничтожается вместе с текущим классом куда он подвязан. Таким образом асинхронный метод при такой реализации никогда не останется в памяти после уничтожения обьекта\класса, и будет уничтожаться вместе с ним. И тогда можно не передавать в каждую асинхронную функцию токен на уничтожение, просто сделав его глобальным в текущем классе. Тоже как вариант реализации. Так же глобальный bool можно связать и с другими ключевыми событиями в классе MonoBehaviour, если это будет необходимо, например еще с OnDisable, чтобы при отключении обьекта, асинхронный код так же "уничтожался". Такой подход избавит от того, чтобы вручную прописывать уничтожение асинхронного метода как на 14:28 Но, тут еще зависит и от конкретных задач наверно, где то возможно быстрее будет написать код из примера на видео.
1 - 4 - (если нажмут на пробел) - 5 - 2 - 3
Там keyUp используется, так что тут вернее будет "если не нажмут на пробел")
@@evgenkonyshock4913 Еще вернее будет, если пробел был нажат, но в этот момент его отпустили
Почему бы не сказать сопрограмма? Coroutine это сопрограмма.
1,4,5,2,3?
да, он в видео потом циферки поменял как оно будет.
запустил и забыл это Invoke(nameof(Method), magicNumber);
Забудьте про этот метод. Его можно использовать только для прототипирования
@@gaitavr1992 ды ну? Это чего это? аргументы-то будут хоть какие-то? мало ли что кому-то он не нравится... но на нём всё отлично работает, адекватно и предсказуемо! в отличии от любых других альтернатив. Не нада так указывать людям, что им забывать, что не забывать, что применять и для чего. Это по меньшей мере, не корректно и самонадеяно. Единственный его минус - невозможность передачи параметров, но и это можно обойти.
Я бы посмотрел на ваш высокооптимизированный код в котором не разберешься без 100 грамм. Это отсылка еще к одному комментарию про ненужность корутин и тасок, свой таймер и тд. 80 процентов кода не чувствительно к оптимизации, а работа в команде очень важна всегда, чтобы любой мог прочитать и изменить чужой код
@@gaitavr1992 как по мне не сильно то и усложняющая. Достаточно помечать методы и не лепить их куда угодно при первой же возможности. А еще можно и к тестированию претензии предъявить ) Я так скажу, а "запутать колег" можно куда круче с помощь какого-нибудь визитера чем корутиной или инвоком.
Если коллеги пишут в императивном стиле, а слово паттерн вызывает ассоциацию с синглтоном, то вопросов нет
только вот является ли карутина по факту асинхронной, можно ли ее так называть
не является
асинхронная, если вызвать её через таску)
Круто удалять из листа во время фора! Проверяй код. Тебе надо тогда i не преращать, чтобы следующий элемент не проебать
Первое предупреждение за мат, следом будет бан
@@gaitavr1992 не стоит. Лучше я отпишусь
@@gaitavr1992 , ))) Тебе указали на ошибку, в первую очередь. То, каким образом это сделано - уже второй вопрос.
Для меня это первый вопрос, когда проявляется открытое неуважение - внятного ответа не будет
2:38 - не читабельным, а читаемым. Давайте говорить по-русски.
Давайте на вихід з цього каналу і розказуйте десь в іншому місці
@@gaitavr1992 лайййкк
1 4 5 2 3