Тёмный

Асинхронное программирование в C# и Unity3D для продвинутых 

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

В этом видео мы углубимся в async/await. Узнаем, почему асинхронность не равно много поточность, как устроен await внутри и как его применить к любому типу.
Ссылка на Discord - / discord
Делегаты и события - • Делегаты и события в u...
LINQ и свой итератор - • LINQ в C#. Продвинутое...
Расширяющие методы - • Что такое методы расши...
Паблик игроделов - special3d
"00:00 - Введение"
"01:40 - Первый пример"
"03:55 - Синтаксис и условия компиляции"
"05:51 - Машина состояний"
"14:17 - Свой awaiter"
"16:24 - Полезные методы"
Поддержка канала:
Patreon - www.patreon.com/user?u=32502669
В крипте:
BTC - 16WmTb4VTFGYrwEjjnMKNNMMzsMB1rPEqD
ETH - 0x8d35406f8317b846528d0a9ea4a34ce59968dff2
XRP - rLW9gnQo7BQhU6igk5keqYnH3TVrCxGRzm (TAG - 1438215071)
LTC- MNSWdzdVsUMnozSU5HhUPEscfxaUK3Fdck
#unity3d #await #async #gamedev #ityoutubersru

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

 

24 июн 2024

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 130   
@alexeygolubev3104
@alexeygolubev3104 3 года назад
До этого видоса даже не задумывался, что под капотом у async/await. Топчик, спасибо за видос !
@mimineko3100
@mimineko3100 3 года назад
да во всех этих фичах (таски, корутины), под капотом жуткие городули, способные сожрать системные ресурсы и память. Так что лучше многопоточности и старых добрых простых условных ветвлений, пока что ничего не придумали... Так же можно программно в апдейт любой набор делегатов помещать - убирать... Ну и свой класс таймера сделать.
@Gekker42
@Gekker42 3 года назад
чувствовал себя "продвинутым" первые пять минут, а потом мозг поплыл. сложно, но познавательно. То, что понял, информацией было полезной, спасибо за видос
@gaitavr1992
@gaitavr1992 3 года назад
Имеет смысл вернуть потом и еще глянуть после некоторой практической работы
@PelipUnityDev
@PelipUnityDev 2 года назад
@@gaitavr1992 Я так поступал со всеми видео по паттернам. Спасибо за видосы))
@toxicknight3079
@toxicknight3079 3 года назад
Круто, но сложна. Обязательно буду еще несколько раз пересматривать, может однажды все дойдет :)
@fumanchez
@fumanchez 3 года назад
дня 2 читаю про асинки, но это лучшее что я видел - и всего за 20 минут
@gaitavr1992
@gaitavr1992 3 года назад
Я бы рекомендовал на практике использовать хотя-бы пару раз, теория выветривается быстро
@ve1c0m
@ve1c0m 3 года назад
Читаю твои комменты, а в голове брутальный голос из видео))) Спасибо, очень ценная информация, много чего узнал.
@simxan123
@simxan123 Год назад
Очень круто и очень непонятно, ошибочно думал, что уже начал разбираться в C#.. Вы спустили маня с небес на Землю😀 Однозначно подписка и изучение контента, высший пилотаж!
@inskips
@inskips 3 года назад
Очень доходчиво. Спасибо за вашу работу. Каждый раз очень жду нового видео.
@ell_pavel
@ell_pavel 2 года назад
Хороший контент, буду ждать второй части!
@JustPlayingBroGD
@JustPlayingBroGD 3 года назад
Ты невероятно полезен!
@DmitryTimofeev_general
@DmitryTimofeev_general 3 года назад
Хороший видос. Мощную работу проделал.
@user-vt9bh6fu4g
@user-vt9bh6fu4g 3 года назад
Спасибо за годный контент!)
@kirillsviderski4739
@kirillsviderski4739 3 года назад
Самый тематичный посыл подписаться в истории Ютуба)
@kirill7637
@kirill7637 3 года назад
Спасибо за отличное видео. Даже опытным разработчикам помогает освежить знания.
@tech_jp160
@tech_jp160 Год назад
Впервые вижу блогера с такой глубиной знаний, спасибо!
@petrosaslanidis
@petrosaslanidis 3 года назад
Спасибо . Как всегда на уровне
@sergei-fil
@sergei-fil 3 года назад
Ничего не понял, но очень интересно)) Шутка) Материал подан очень хорошо! Спасибо большое! Давно хочу разобраться с async/await и думаю это видео мне очень сильно в этом поможет, буду точно его пересматривать ещё несколько раз.
@MOQred
@MOQred 3 года назад
Года 2 назад был бы такой видос, не было бы предела моей радости и задачу закрыл бы в срок xD Очень хорошо рассказано
@user-nv6gj6hg2s
@user-nv6gj6hg2s Год назад
Спасибо, было познавательно!
@neitron29
@neitron29 3 года назад
очень недооцененный ролик - тема и ее разбор очень интересны! именно так и должно изучаться программирование - когда код разработчика осознаный! Спасибо большое - желаю роста каналу! лайк подписка)
@user-lg5se3nj1e
@user-lg5se3nj1e 3 года назад
Видео огонь 🔥 Узнал много нового
@aynotation5202
@aynotation5202 Год назад
Не первый раз смотрю это видео, но если раньше это было просто под попкорн, и я тогда ничего так и не понял, то сейчас возникла именно необходимость в данном материале, и зашло на 10/10. Ни один из вопросов по асинкам не остался без ответа. Благодарю
@user-qb8lx2uq5j
@user-qb8lx2uq5j 9 месяцев назад
Хз, в справочниках намного больше инфы. Но она вся вряд ли кому-то нужна, даже то, что здесь, не нужно большинству программистов Unity. Но стоит как минимум прочитать, чтобы иметь представление и все это не казалось магией в реальных примерах.
@inrage7871
@inrage7871 Месяц назад
@@user-qb8lx2uq5j Подскажи такой справочник пожалуйста
@vsevolodmetelsky1275
@vsevolodmetelsky1275 3 года назад
Отличное видео, спасибо.
@voltionboal9390
@voltionboal9390 3 года назад
Спасибо, полезно но сложновато -нужна практика, очень мало такого рода контента особенно на русском ютубе, очень интересно и полезно про всякого рода способы оптимизации, продолжай в том же духе))
@user-pd9eq4dq7n
@user-pd9eq4dq7n 3 года назад
Понял где то половину, наверное....) Очень интересно, спасибо!
@gaitavr1992
@gaitavr1992 3 года назад
Когда понадобится свой эвейтер или случится странное поведение, то можно попробовать посмотреть еще раз)
@user-zf8wh5pn6i
@user-zf8wh5pn6i 7 месяцев назад
Спасибо за видео!
@user-hk7qf9wl1m
@user-hk7qf9wl1m 10 месяцев назад
Спасибо. И ещё четыре слова.
@user-bn6bs9qk1z
@user-bn6bs9qk1z 3 года назад
Круто, жду продолжения !
@gaitavr1992
@gaitavr1992 3 года назад
На эту же тему?
@andrewmad
@andrewmad 3 года назад
Круто, Макс!
@avaloniuss
@avaloniuss 3 месяца назад
Круто рассказал!
@user-hn3lf4nx8o
@user-hn3lf4nx8o 2 года назад
Спасибо, помогло в работе
@user-tf9lo4fi4m
@user-tf9lo4fi4m 3 года назад
Сама тема классная, да и голос что надо. Чего мне реально не хватает, это дельных примеров (желательно простоватых), где это конкретно стоило бы применить. А так, спасибо, очень познавательно.
@gaitavr1992
@gaitavr1992 3 года назад
Этот ролик про то, как работает изнутри, естественно он предполагает опыт использования тасок. В интернете куча примеров для новичков есть, в том числе рунете
@AlexPlayer1000
@AlexPlayer1000 3 года назад
Было бы здорово в будущем увидеть уроки по UniRX сейчас на работе только их и используем
@easycodeunity3d14
@easycodeunity3d14 2 года назад
Кайф. Спасибо!
@justlama0
@justlama0 3 года назад
Годнота)
@orik9242
@orik9242 3 года назад
Я от Сакутина. Очень благодарен ему за рекламу и тебе за познавательное видео.
@gaitavr1992
@gaitavr1992 3 года назад
Я ему тоже благодарен, бустанул мне канал очень хорошо)
@lkghost7
@lkghost7 3 года назад
просто отлично
@rdragon587
@rdragon587 3 года назад
Cool) thanks
@skyjen5594
@skyjen5594 2 года назад
Я исполнил твою сихнронную операцию!
@KillerBestUselesmoun
@KillerBestUselesmoun 3 года назад
Крутая инфа с точки зрения понятий устройства async await методов внутри, но так как канал ориентирован на разработку на Unity, я ожидал увидеть практичное применение этих самых async await, рассмотреть отличия async await от корутин и как можно заменить эти самые корутины. Машина состояния - одновременно интересно и не понятно) особенно не понятно, где это можно применять)
@gaitavr1992
@gaitavr1992 3 года назад
На базовом уровне там нечего применять, я хотел рассказать о внутренностях, так как это мало кто знает. Разработка на юнити ведется на шарпе и кто им не владеет хорошо - ничего не сможет сделать толкового
@gaitavr1992
@gaitavr1992 3 года назад
И машину состояний сам никто не пишет, кроме кастомных эвейтеров. Зато знание принципа дает избежать различных проблем типа дедлока
@user-xi6lq7iy4t
@user-xi6lq7iy4t 3 года назад
хорошее видео, спасибо..можно сделать такое же, но про корутины ? как они под капотом работают и потом их сравнение с async/await
@gaitavr1992
@gaitavr1992 3 года назад
Как-нибудь дойдем
@user-bc4me5kz7j
@user-bc4me5kz7j 3 года назад
Спасибо большое за видео. Очень интересно если бы ты рассказал про многопоточность в юнити. Например как работают корутины, в одном потоке ли работает юнити и если да, то по какой очередности запускаются скрипты? Спасибо еще раз
@gaitavr1992
@gaitavr1992 3 года назад
Судя по тому, что вы написали, присутствует сильная путаница. В рамках c# роликов сниму
@aa-ly9on
@aa-ly9on 2 года назад
Спасибо
@stanislavsh6582
@stanislavsh6582 3 года назад
Хех, помню времена когда TPL не было. Хорошо, что те времена уже в прошлом. Не то чтобы я такой старый, просто шарп начал ковырять еще в школе.
@eyellen
@eyellen Год назад
Очень интересно, хотелось бы спросить, а где можно найти все эти тонкости языка ? А то я прошелся по возможностям языка, но теперь интересно как оно устроено внутри, хочется узнать все тонкости и детали, может есть какая-то книга ? Или где вообще можно найти об этом ?
@ilyanazarov7001
@ilyanazarov7001 2 года назад
Спасибо за видео! Запустил у себя ваш кастомный awaiter, но обнаружил, что второй await также срабатывает при повторном нажатии button1. Результат при этом выводит такой же, как и при последовательном нажатии button1 и button2. Почему так?
@grinde_wald6888
@grinde_wald6888 3 года назад
Здравствуйте, могли бы вы рассказать как можно сделать меню паузы с остановкой игры, но чтобы при этом анимация и Particle system работали нормально. Заранее спасибо. И большое спасибо за познавательный контент.
@NoldoWalker
@NoldoWalker 3 года назад
Очень мощно, недавно начал сам изучать эту тему, а тут удачно подъехал видос. Я правильно понимаю, что объяснение про машину состояний - это про то что под капотом у асинк-авейта и в целом можно и без знания этого им пользоваться? Просто в этом месте я понимание потерял. Upd. Из примера про кнопку понял что только с базовыми типами. Надо будет довкурить, чтобы делать камтомные авейтеры на все подряд.
@gaitavr1992
@gaitavr1992 3 года назад
Все верно, стейт машина+эвейтер+каркасный метод и будет работать без async await
@NoldoWalker
@NoldoWalker 3 года назад
@@gaitavr1992 спасибо
@user-bo6zf7ip7p
@user-bo6zf7ip7p 2 года назад
коментарий оставил. остальное сделал сразу перед видео, поэтому чтобы продолжить асинк или авейт?
@ruslan_yefimov
@ruslan_yefimov 2 года назад
Такой чёрной магии я не видел с тех пор, как пытался писать шейдеры..
@mprils
@mprils 3 года назад
Хорошее видео, спасибо Однако Стоило рассказать как не нужно делать чтобы не получить дедлок А также, что цена этого всего удобства - аллокация памяти И если в обычном .нет вне юнити - это терпимо, то у юнити довольно печальный GC Поэтому что-то там поэвейтить в UI - это нормально, а вот создавать таски направо и налево в игровой логике - так себе идея
@gaitavr1992
@gaitavr1992 3 года назад
Примеров дедлоков куча в интернете, я не хотел еще затягивать и без того сложное видео. А про выделение памяти все сказано
@alexsklyarov6792
@alexsklyarov6792 3 года назад
Круто, еще б примеры где лучше применять async, а где IEnumerator, спасибо.
@gaitavr1992
@gaitavr1992 3 года назад
Так это разные вещи в плане применения. Async нужен для асинхронного выполнения метода. Ienumerator это перебор коллекции
@alexsklyarov6792
@alexsklyarov6792 3 года назад
@@gaitavr1992 я возможно не совсем понял ответ, но я имел ввиду когда используют coroutine и в методе есть такой код: yield return new WaitForSeconds(time), зарание спасибо)
@gaitavr1992
@gaitavr1992 3 года назад
Ну корутина только с gameobject работает и всегда в одном потоке. Async работает везде и можно настроить потоки. Для легких вещей корутина ок
@seldemirov
@seldemirov 3 года назад
@@gaitavr1992 Насколько я понимаю, async включает в себя весь функционал корутины и привыкнув к нему можно от корутин отказаться. Так ли это? Или есть случаи где так просто замену провести не получится?
@gaitavr1992
@gaitavr1992 3 года назад
Корутина легче таски, иногда это критично. Плюс ожидание кадра и подобные юнити вещи заменить сложно
@Nik0lay11
@Nik0lay11 2 года назад
Если есть таска t и у нее есть ContinueWith то нужно ли делать после ее создания await t - а то в видео говорится что авейтить целую конструкцию не получится(либо одно либо другое) но автор добавляет код "await t;"? Если авейт нужен то после него может быть еще код и другие авейты(которые отработают после ContinueWith?)? Если не нужен то как обработается ексепшн если он выбросится в ContinueWith?
@timurakhmetov5725
@timurakhmetov5725 2 года назад
Максим, спасибо за видео. У меня вопрос: где выполняется таска, которую мы await'им. Вот у нас есть асинхронный метод, мы его вызываем, он выполняется до первого await, в await у нас таска, выполняющая длительную операцию. после await управление возвращается, основной поток не блокируется, и выполняет другие операции. Но где выполняется таска: в основном потоке параллельно (хотя насколько я помню, поток может выполнять только 1 задачу), в другом потоке, берется он из пула и т.д.? И как с этим всем связана машина состояний?
@gaitavr1992
@gaitavr1992 2 года назад
Лучше еще раз посмотреть видео, особенно момент с самописными эвейтерами
@peterpashchenko301
@peterpashchenko301 2 года назад
Круто. очень advanced, но увы весьма сложно для понимания. Кроме разных вариантов применения класса Task.
@Bushido_Cat
@Bushido_Cat Месяц назад
подскажи плис где можно почитать по подробнее по тому что ты показал?
@nonamenoname5824
@nonamenoname5824 3 года назад
Good
@TheTalionn
@TheTalionn 3 года назад
А можно 1-2 примера, когда стоит все таки отправлять Task в отдельный поток?
@gaitavr1992
@gaitavr1992 3 года назад
Я делаю это при первой возможности, чтобы разгрузить главный и если я не работаю с юнити типами (gameobject, texture и тд)
@TheTalionn
@TheTalionn 3 года назад
@@gaitavr1992 спасибо
@alexspeleers
@alexspeleers 3 года назад
бекгрануд в паверпоинте - юзал в универе на каких-то презентациях (((:
@alexspeleers
@alexspeleers 3 года назад
видел на каком-то буржуйском канале про стейт машину в асинк авейте, но там о билдерах/диспоузах ничё не говорили, как же хорошо что это всё под капотом и не надо гемороится. А кста разве оно не в IL код компилится, или вот тот С# код со свичами ты чисто для наглядности бахнул?
@gaitavr1992
@gaitavr1992 3 года назад
Это до IL кода, все await и async преобразуются в стейт машины и эвейтеры
@staskapanin
@staskapanin 3 года назад
Максим, что думаете по поводу последних двух абзацев(Avoid using async and await) из этой страницы документации Unity? docs.unity3d.com/Manual/overview-of-dot-net-in-unity.html Контекст синхронизации Unity всё равно заставляет работать всё в главном потоке и нужно использовать контекст по умолчанию или свой? Одинаково ли работает async/await в .NET и в Unity IL2CPP(на разных платформах, например UWP)?
@gaitavr1992
@gaitavr1992 3 года назад
Таски генерируют много мусора, что критично в узких горлышках(по ситуации смотрят). Если не указать какой синхронизационный контекст использовать, то все выполнится в том же потоке и проблем с unity типами не будет. А вот если эти типы не использовать, и не выполнять работу в том же контексте, то будет работать быстрее.
@gaitavr1992
@gaitavr1992 3 года назад
С uwp работал очень давно, когда еще таски не знал, сложно сказать. Ставлю на то, что будет работать
@user-sj6rx9yu8y
@user-sj6rx9yu8y 2 года назад
Await'ы, как я понял, лишь маркеры для компилятора, показывающие, как разбивать метод. Что будет, если между await'ами поставить goto? Например, {Label: await Task.Wait(1000); goto Label;} будет всего лишь бесконечный переход на состояние 1? Или такой подход может прям сломать async/await?
@gaitavr1992
@gaitavr1992 2 года назад
Мне такое никогда не пришлось бы попробовать. Я не использую goto в принципе, а вот в async/await он используется
@user-sj6rx9yu8y
@user-sj6rx9yu8y 2 года назад
@@gaitavr1992 а я все же проверил. Ничего не сломалось. Видимо, бесконечный переход на состояние 1
@SterinGM
@SterinGM 2 года назад
Под WebGL это будет работать? У меня не получилось завести ((
@ViATVmy
@ViATVmy 3 года назад
Спасибо если можно и про
@gaitavr1992
@gaitavr1992 3 года назад
Про что?
@Gekker42
@Gekker42 3 года назад
@@gaitavr1992 походу он OperationCanceledException получил пока писал, а отправка сообщения уровнем выше стояла
@tr0sty
@tr0sty 3 года назад
есть ли способ килять все асинхронные процессы, запущенные в коде, при выходе из play mode в эдиторе?
@gaitavr1992
@gaitavr1992 3 года назад
Я бы cancellation token использовал. Также при рекомпиляции таски очистятся
@greemdim4611
@greemdim4611 3 года назад
А как вы смотрите на то, чтобы создать плейлист по сишарпу на юнити для людей, которые знают только основы обычного сишарпа?
@gaitavr1992
@gaitavr1992 3 года назад
Если человек знает обычный шарп - у него нет проблем в юнити с этим)
@greemdim4611
@greemdim4611 3 года назад
@@gaitavr1992 ну, я вот например знаю основы, то есть переменные, циклы, условия, массивы и так далее. Но при этом программировать на юнити я не могу, там же сишарп другой по идее
@gaitavr1992
@gaitavr1992 3 года назад
7й си шарп, вам нужно несколько вводных уроков пройти для начинающих, так как у меня контент ориентирован на повышение квалификации разработчиков junior +
@vasyalapuh2878
@vasyalapuh2878 2 года назад
Самое время написать что сложно с наскока понять.
@GaniSo
@GaniSo 7 месяцев назад
жалко что у тебя перестали выходит видео (
@user-oe4op3bk1g
@user-oe4op3bk1g 3 года назад
На слух очень сложно понять, вот бы код посмотреть
@modjaid3907
@modjaid3907 3 года назад
а в юнити требуется использование тасков и асинхронных методов? Вроде же все решают курутины
@gaitavr1992
@gaitavr1992 3 года назад
Это один из инструментов, требоваться может только в том случае, если команда повсеместно его использует. Но скажу сразу, что если проект не очень стеснен в производительности , то там будет или UniRX или Task
@vasyalapuh2878
@vasyalapuh2878 2 года назад
Я понял что ничего не понял. Требуэ пересмотр.
@_EnVyUs
@_EnVyUs 3 года назад
когда узнаешь внутренности функций или какой либо логики в языке программирование, это пугает и ты отказываешься от использования этих возможностей :\
@gaitavr1992
@gaitavr1992 3 года назад
Не надо так)
@andrew_t800
@andrew_t800 3 года назад
Нрмас. Я не ожидал описания того что происходит "внутри". Много "кривой" инфы у других авторов - иногда прям бесит. Запили видос про потоки! Как и когда использовать, ато у меня весь проект изначально на корутинах, а вот выделили время на рефактор, но я в Юнити не силён в потоках - очень не хочется "перемудрить".
@gaitavr1992
@gaitavr1992 3 года назад
Дойдем и до потоков
@ilyakruglow6486
@ilyakruglow6486 3 года назад
я думал асинк не работает с монобехами
@malvislightfadynightgames2925
@malvislightfadynightgames2925 3 года назад
Так и не была раскрыта явная разница между многопоточностью и асинхронностью. На том же metanit объясняется лучше
@polarbar780
@polarbar780 2 месяца назад
Вижу, что ролик общеобучающий. В этой ситуации объяснять различие между асинхронным программированием и многопоточностью в начале неправильно. Это сбивает людей с толку. Разумно сосредоточится на самом механизме,принципе его работы, а само различие объяснить в конце. Тем более,что это различие не касается самого механизма. Я могу с помощью async-await запустить две параллельные задачи, которые будут выполняться на CPU и это не какой-то крайней случай, а вполне распространенная практика. Да и сам термин "асинхронность" но никак не связан с CPU, скорее он означает процессы, выполняющиеся независимо друг от друга. Поэтому, есть ли разница в какой среде происходит это выполнение (на разных устройствах или одном cpu)? На мой взгляд нет. Всё твердят как догму "асинхронность не равно многопоточность", а я скажу, что в ряде случаев равно 😅 И что, я буду не прав?
@addmusic1484
@addmusic1484 2 года назад
Люди у вас тоже ошибка: async не поддерживается 2.3 версии
@saasrus
@saasrus Год назад
Инфа очень плотная, это видос не на один раз, несмотря на небольшой хронометраж.
@coolrash
@coolrash 2 года назад
Нахрен мне этот async, если я никак не могу с ним взаимодейстовавать с игрой? Ну для вычисление всяких формул пойдет, но мне надо нормальный многопоточность и с нормальным доступом с основным потоком. А то там все нельзя ничего взять присвоимть. Вообще ничего нельзя. Только вычисление координаты х и то как это возвращать - тайна века. Кароче много поточность в юнити сосет
@gaitavr1992
@gaitavr1992 2 года назад
Что за высер?
@coolrash
@coolrash 2 года назад
@@gaitavr1992 я пытался генерировать коллайдер в реальном времени, изза этого в игре были фризы достаточно много кадров, что очень портило игру. Я хотел это в фоне обработать и передать в основной поток. Но как я понял, в юнити нету многопоточности с основным игровым потоком. Только эти координаты можно обработаьь и васё. А так тогда был излишне эмоционален, так как 1 месяц потратил на эту затею и не смог решить эту проблему.
@Andrei_Kozlov
@Andrei_Kozlov 2 года назад
При объяснении не хватает примеров в играх... по этому полное непонимание
@igorcoolman
@igorcoolman 11 месяцев назад
первые 5 минут понятно, потом ересь какая-то
@malvislightfadynightgames2925
@malvislightfadynightgames2925 3 года назад
Опять цвета одинаковые. Как это понимать. Если бы цвета значимых типов и ссылочных типов были разные, то тебе не пришлось бы объяснять, что AsyncVoidMethodBuilder это структура. Не подумай, что я придираюсь, я просто хочу сделать из твоих шикарных знаний в виде видеоуроков ещё и удобную интерпретацию для впитывания этих знаний.
@ashotrustavelyan7498
@ashotrustavelyan7498 7 месяцев назад
в самом главном моменте обьяснения не обьяснил
@belousov_gaming
@belousov_gaming 2 года назад
Спасибо за видео!
Далее
🥔 Sloppy Joe Potato Casserole ~#Shorts
00:23
Просмотров 2,8 млн
КОГДА БАТЕ ДАЛИ ОТПУСК😂#shorts
00:59
TYLA DANCE TREND😭 | #shorts #emilydobson
00:12
Просмотров 1,8 млн
TypeScript для продвинутых за 2 часа
2:14:01
Паттерн декоратор в unity3D
8:00
Просмотров 18 тыс.
🥔 Sloppy Joe Potato Casserole ~#Shorts
00:23
Просмотров 2,8 млн