Mikhail Kolobov | Gamedev Forge
688 subscribers
106 photos
8 videos
121 links
Unity - менторство и разработка игр.
https://teletype.in/@redhurt/mentoring
Boosty - https://boosty.to/gamedevforge
Мой тг: https://t.me/mikhail_kolobov
Download Telegram
Какое-то время назад на ютубе появились такие ребята и взорвали мой мир “туториалов на ютубе”, полный довольно второсортного контента. Что не удивительно, когда те самые туториалы начинают пилить архитектор, тимлид и техдиректор знаменитого Raid: Shadow of Legends (ловлю флешбеки от их бесконечной рекламы даже когда читаю название). Там было про адресаблы, юнит тесты, CI и так далее.

Одной из их фичей на курсах была стейт машина, которая целиком контролирует приложение. Загрузка - стейт, главное меню - стейт, уровень - стейт. Я все это время не понимал такого подхода так как:

- Глобальных стейтов у игр не то чтобы много - загрузка, меню, кор игра, а остальное уже внутрянка самих стейтов.
- Запрашивать стейт нам как правило не нужно. Так как сложно представить одинаковые модули, которые бы создавались на многих стейтах, но вели бы себя по разному в зависимости от них.

Короче выглядело, как явное нарушение KISS во имя сомнительного выигрыша по… стабильности? консистентности? простоты?

Удивительнее всего что в конечном итоге такой подход мне пригодился не на огромном проекте, в котором можно “Collect over 700 Champions and take down your opponents!” (простите), а на обычном фрилансе.

Выпал проект который как раз можно разбить на много глобальных стейтов (скрин в комментариях), но при этом последовательность некоторых из них была критична. Изначально я делал на собственном костыле фреймворке для управления интерфейсом, но благодаря паре менти вспомнил об этом подходе и вуаля!

- Смена экранов привязалась к смене стейта вместо их ручного переключения
- Пропали все перекрестные ссылки между модулями, интерфейс и сервисы для звука и обработки видео стали работать тоже от своих стейтов
- Все модули проекта переехали с pull-модели на push-модель взаимодействия, из-за этого исчез этот вечно раздутый бутстрап, в который приходилось залезать для каждой правки

Вывод: чаще смотри ютуб и лучше слушай тех, кому помогаешь!
P.S. Поддержите огоньками для более подробной статьи на хабре
🔥52❤‍🔥2
Сейчас учусь на последнем семестре прикладной информатики в экономике. И эта война с их фронтедерами принимала самые разные обороты:

- Сначала на их тестах нельзя было просто копировать, поэтому мы драг-н-дропали вопрос в гугл
- Потом они в какой-то семестр что-то поломали и все правильные ответы были первыми, поэтому в этот семестр я был круглым отличником)
- А сейчас новый виток эволюции - уже и текст нельзя выделить.

Буду считать это за мета-экзамен - зачем бы еще они меня поверхностно учили веб разработке, если не ради выдергивания вопросов из верстки.
Жаль, что не успею застать как они начнут отрисовывать всю страницу на канвасе, чтобы еще и это победить...
Бонусом в комментариях сможете посмотреть какими невиданными знаниями надо обладать чтобы учиться в Синергии😂
😁3
Tips and tricks для адептов консольного гита
Иногда меня тянет на извращения поработать с консольным гитом. Но каждый подход к нему начинается с боли - перейти в папку с проектом через проводник и оттуда через контекстное меню открывать гит.

Однако после какого-то принятия в свою жизнь Syster.Diagnostics.Process, стало возможно оптимизировать этот процесс и открывать гит прямо из проекта.

А теперь сможете и вы! GitHub Gist
Если у вас git-bash лежит в другой директории, то придется подменить его ручками в коде… или наставить мне огонечков под постом, чтобы я оформил это в полноценный пакет, в котором не будет такой необходимости

Но вообще обычно я пользуюсь Fork - это единственный клиент, горячие клавиши которого не сломают тебе пальцы через пару дней) Пишите в комментарии какими оболочками пользуетесь вы
🔥3
Коротко про Unity keynote

Начали с извинений за Runtime Fee в виде пацанских цитат, про то что “Доверие не то что мы говорим это то что мы делаем” - ауф
Еще раз порекламили DOTS и SRP, показывая как они поднимают фпс с 10 до 30 (видимо остальные кадры решили придержать до следующего keynote, иначе без работы останутся)
Дальше пиарят свой мультиплеер (который как говорят и правда неплохой), но при этом почему-то лаги в их демке было видно даже на презентации…
Представили еле рабочую интеграцию с нейронками, которая выглядит как чей-то пет проект после скилбокса: "ой мы теперь умеем генерировать картинку и класть ее в папку проекта"
С ним же проанонсировали средства борьбы с юными любовниками чужих матерей - сервисы для цензуры и определения токсичных игроков
В конце был Unity cloud, про который вдруг вспомнили но забыли докинуть хоть каких-то фичей и сказали про поддержку новых VR-шлемов от бесконечности и яблока

Как итог в очередной раз: “это я не плачу, это демка пятого unreal в глаза попала”
😁5😢2
Свет управляется звуком (NAudio)

За такую фразу можно было легко получить двойку за уроке физики. Но спустя столько лет это оказалось вполне возможно, когда работаешь со проф световым оборудованием. Сигналы для него кладутся в звуковую дорожку, которая звучит как старый модем.

Проблема в том, что отправлять на свет эту звуковую дорожку нужно через определенный порт на компе, и ,само собой, не включать это пользователю. Чтобы он не сбежал от этого поросячьего визга к твоим конкурентам. А проблема юнити в том, что она не умеет включать звук в определенный звуковой порт. Что же делать?

Тут на помощь пришла NAudio - по сути обертка на другие библиотеки для работы со звуком. С помощью нее можно работать со звуками практически в любом формате. Можно их проигрывать, записывать, конвертировать, сшивать, микшировать и тд. В том числе можно указать на какое именно устройство отдавать выбранную звуковую дорожку.

Из минусов - за такими звуками и их проигрышами нужно следить вручную. То есть, держать на все ссылки и по необходимости все выключать и диспоузить. Иначе можно словить ситуацию в которой поросячий визг будет играть даже при выключенном приложении и ровно до тех пор пока не выключишь ПК.

Надеюсь, что следующим проектом надо будет сделать диджейский пульт на юнити, чтобы еще разок поработать с этой библиотекой)
👍3
Боже, дай мне силы победить синдром самозванца, тоже делать гиперказуалки и с уверенным видом писать всякую чушь на канал большую чем сейчас👇🏻
😁1
Forwarded from Лавка Разработчика (Andrey Vavilichev)
Не используйте LINQ, говорили они

А почему - не говорили. Исправляем ситуэйшн. Что такое LINQ и как с ним работать я рассказывать здесь не буду, это прекрасно передано в видео, которым я уже делился однажды. А перейду, непосредственно к вопросу, почему же говорят не использовать LINQ, при этом часто сопровождается магическим "память жрёт".

Жрёт память - это да, но далеко не всегда, а в конкретных случаях. И нас, как разработчиков интересует не столько размер потребляемой памяти, сколько частота ее выделения. Ведь выделение памяти вызывает ее фрагментацию, а от этого и разные приколы вылезают. Подробнее я рассказывал в видео "Как работает память в C#".

Соответственно самое важное при использовании LINQ - понимание, что им не рекомендуется пользоваться в местах, которые вызываются часто. Update, например, - не место для использования LINQ (еще раз повторюсь, речь идет о тех методах LINQ, которые все-таки выделяют память, остальными пользуйтесь на здоровье и в Update).

Иными словами, LINQ безжалостно можно использовать в различных инициализациях.

Однако, чтобы полностью закрыть этот вопрос, давайте перечислим методы LINQ со звездочкой (выделяют память) (все они возвращают созданную коллекцию, если что):

1️⃣ ToList()

2️⃣ ToArray()

3️⃣ ToDictionary()

4️⃣ ToHashSet()

5️⃣ Методы групировки Concat(), Union(), GroupBy(), GroupJoin()

6️⃣ Метод сортировки OrderBy()

Немного, правда? А криков-то было.

UPD: Методы First(), Any() и другие и подобные используют память для хранения результата, это либо значение, либо ссылка. Но нужно иметь ввиду, что память активно используется делегатами, применяемыми для этих методов, так что если юзаете их в частоиспользуемом месте, делегаты лучше закешировать.

#полезное #советы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Дебаг в Unity

Поиск своих или чужих ошибок в коде занимает, наверно, бОльшую часть разработки любого ПО. И тому, как искать их качественно, к сожалению, не учат ни на одном из хороших неоправданно дорогих курсов из тех что я видел на торрентах. А при самостоятельном погружении в программирование, до такого скорее всего и не доберешься, так как о существовании таких инструментов даже не подозреваешь.

Недавно в разговоре с менти оказалось, что он не знаком с таким инструментом. А я, дурак, на мок собесе увидел как он уверенно отвечает на все вопросы по языку и движку, что и не задумался спросить его о таком. Да и что тут говорить, если я и сам в свое время проработал почти год с дебагом принтами.

Поэтому для всех кто еще не разобрался как искать ошибки в программе без Debug.LogError написанных на каждой второй строке, я прошерстил ютуб и нашел хороший, основательный туториал по основам работы с ошибками компиляции и рантайма.

Один момент:
Не совсем правильным считаю ту часть, где он показывает: “вот, добавьте GameObject в метод чтобы его можно было вывести в лог”. Так как логирование гораздо более низкоуровневый модуль в сравнении с бизнес логикой нанесения урона. И вторая ни в коем случае не должна знать о первой. Это все равно что вы, заказывая кофе, будете думать: “Ой, а вдруг у чувака который собирал эти кофейные зерна 2 месяца назад в условной Индии заболела собачка и он их плохо собрал, может там мусор какой вместе с ними, если так тогда лучше возьму чай”. Примерно также безумно выглядит проброс данных для логирования в предметную логику приложения.

Но опять же это видео для начинающих, которые не успели освоить дебаг…

P.S. Насмешило, что почти 20 секунд видео, автор тратит на то чтобы объяснить как перевести время из 13:57 в 1:57pm
👍4
А я всегда говорил, что Unity - игрушка дьявола
😱4❤‍🔥2🤣2🔥1
“Улучшенный синглтон”

Что может быть хуже синглтона?
Ютуберы, которые пишут что “программируют уже 30 лет” и потом выпускают видео “улучшенный синглтон”. Все равно что привязать бантик на пакет с говном, который вы подкинули под дверь…

Синглтон был признан антипаттерном практически сразу после выхода книжки GoF Design Patterns и спустя почти 20 лет не восстановил свой авторитет ни на йоту.

Если без шуток, то вполне адекватно использовать синглтон для околостатических зависимостей. Типа аналитики, рекламы, платежки, дебага и тд. Когда время жизни 99% кода короче того самого синглтона. Но копипастить древнейший скрипт для его реализации в юнити и говорить “вот мы в 2023 году придумали как сделать крутым древний антипаттерн”, это совсем какая-то деменция которая доступна только в особых заведениях или на ютубе.

Я вот даже упрощу задачу тем, кто мог повестись на эти сладкие речи и тем кто хочет его использовать по назначению и скину гист с кодом, который я нашел 7 лет назад на unity forum и который они представляют как “singleton impovement”
https://gist.github.com/redHurt96/168f92b178cf0efd040c75ba965a6a28

Справедливости ради, в их коде присутствуют конструкции "lock”, то есть поправки на доступ и создание со многих потоков, на которые довольно странно ориентироваться, используя синглтон вообще. Все равно что купить роллс ройс и разгонять его ногами как флинстоуны...
👍3🔥2👎1
Оказывается, я не прикрепил само видео, с которого развел все эту синглтоновую полемику...
Смотрите, но с осторожностью)
Event bus, signal bus и электробусы

Много холиваров ходит на тему шины событий. Даже опытнейшие из нас критикуют его за то, что он разжижает предметную логику (и это говорит любитель ECS!!!) и прячет зависимости. Но как правило такие мнения берутся либо из плохой реализации либо из поверхностного понимания паттерна. Например, в качестве плохой реализации реально прячущей зависимости подойдет первый пример из этой статьи. Справедливости ради, мне лично очень понравился последний вариант с интерфейсами и планирую опробовать его на следующем проекте (хотя бойлерплейта от него как будто бы больше).

Также хочу порекомендовать хорошее видео по реализации паттерна. По большей части оно не дает никаких новых знаний, но показывает такую крутую штуку как WeakReference. По сути, она просто не индексирует ссылку на объект для сборщика мусора. При ее использовании важно не забывать все равно явно контролировать свои подписки. Это скорее памперс, который удержит некоторую утечку памяти, а не серебряная пуля.

Еще в качестве “гигиены” использования шины событий, настоятельно рекомендую при возможности не использовать ее статически. Как, например, это по умолчанию предоставляет UniRx со своим MessageBroker.Default. И если используете ее между различными архитектурными слоями (например, между доменом/сервисами и сервисами/вьюшками), то используйте разные. Таким образом вы сможете синхронизировать их жизненный цикл и избежать утечки памяти через забытые подписки.
👍4
Привет!
В попытках наконец дойти до запуска собственного ютуба, я столкнулся с небольшой трудностью… О чем вообще снимать?!

Ведь казалось бы, и без меня есть много энтузиастов написать о “как сделать инвентарь в юнити”, а какие-нибудь специфические темы по типу “AI + ECS” понравятся буквально паре человек из числа юнитистов

Поэтому начнем с простого опроса, 25 человек - тоже статистика)

Какую серию роликов вы с радостью начали смотреть? (Опрос после поста)

- "AI альманах" или “Самый умный”, сделаем простеньких сражающихся человечков, перенесем их интеллект на все известные фреймворки (FSM, BT, GOAP, Utility AI, ML) и заставим их сражаться друг с другом
- AI + ECS - менее интересная, но наиболее нераскрытая тема (настолько нераскрытая, что даже ютуб по такому запросу не выведет ни одного видео). Возьмем условных человечков из пункта выше, напишем их на ECS и будем также имплементировать все вариации ИИ
- Физически точный контроллер персонажа для платформера (или не платформера). В рамках одного из проектов удалось сильно погрузиться в эту тему и понять что буквально ВСЕ ролики на том же ютубе не показывают, как именно это сделать. Поэтому можем вместе собрать персонажа, который будет максимально реалистично себя вести
- Шина событий в играх. Сделаем игру, и свяжем все ее слои между собой только при помощи шины событий. Никаких сквозных зависимостей и протекающих абстракций!
👍3
Каждый раз говорю себе, что фриланс - ужасное занятие и клянусь, что этот проект будет последним. Но в конечном итоге, ни на одну созданную мной игру не было так приятно смотреть, как на такие штуки)

P.S. Кстати, тач-панель, свет, звук, камера, экран на фоне и телесуфлер - это все одно приложение на юнити

P.P.S. Надо было убрать снизу панель с ошибками перед тем как фоткать😂
🔥6👍2😁2
Mikhail Kolobov | Gamedev Forge
Что бы вы хотели посмотреть?
С крошечным отрывом победила “шина событий”! Поздравляю всех голосовавших и себя, что не придется лишний раз придумывать идеи)

Голосовавших за другие варианты прошу не переживать, видео по ним точно будут, мне и самому хочется создать такие проекты. А ваш интерес к этим темам - очень хороший дополнительный заряд мотивации!

Касательно победителя. Думаю, сделаем что-то в стиле магики. Тем более, что игра мне очень нравится, но мне так и не хватило сноровки чтобы пройти ее до конца)
🔥3
Курс по Unity

Наконец-то, свершилось!
Роман Сакутин, известный бесконечным количеством срачей с другими блогерами борец за “чистоту” кода, выложил полный курс по Юнити в открытый доступ.

Помню, когда вышел его курс по C#, в группе в ВК демонстрировалась статистика по видео. Оказалось, что среднее время просмотра было около 6 минут😂 Из 9 часового ролика!

Осталось найти 15 свободных часов (во время работы), чтобы посмотреть новый. И перестать наконец-то советовать ученикам на менторинге скилбосковский курс с торренов😅
❤‍🔥2🔥2😁2
Однажды делал такое на VR проекте для музея. Естественно, там все на GPU и все супер медленно. Особенно на слабеньком железе окулуса и на требовании выжать хороший фпс...
Но сама механика прям рисовать кистью картину была довольно приятная при прохождении (гораздо приятнее остальных механик на проекте)
Ставьте реакции чтобы я сдул пыль с VR-шлема и нашел этот шедевр)
👍2