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
Свет управляется звуком (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
За что я не люблю паттерн Команда

https://www.youtube.com/watch?v=attURV3JWKQ&ab_channel=Unity
Если открыть сотню источников про паттерн Команда, то скорее всего вся сотня будет про “вот можно использовать для пошаговых игр для Undo/Redo действий пользователя”. И в каждом из этих источников будут рассказывать либо про отмену хода в какой-нибудь пошаговой игре (если контент из игровой области) или про “отмену ввода в текстовом редакторе”. Как бы я ни старался придумать хоть один иной вариант использования, за столько лет в голову не пришло ни одного другого примера на который он бы идеально ложился.

Однажды у меня был диалог на очередном собесе (спрашивает тимлид того проекта):
- А можешь придумать хоть один другой пример для этого паттерна?
- Нет, а ты можешь?
- Нет

Что в сумме делает этот паттерн самым узконаправленным (читай, бесполезным) в реальной разработке.
👌2
Channel photo updated
Media is too big
VIEW IN TELEGRAM
Планировал наконец-то смонтировать видео про шину событий, но вспомнил, что должен был сдать диплом неделю назад
Поэтому вот небольшое превью пока я кропотливо пишу chat gpt генерит 75-90 страниц диплома)
5
Мы это сделали!

Спустя недели прокрастинации, оно случилось - мой первый ролик на ютубе! Далеко не шедевр, конечно же. Но лучше я через пол года словлю испанский стыд от него, чем ничего не сделаю вовсе)
Конечно же, главный вектор развития в будущем - это голос. Очень тяжело начать работать ртом на 27 году жизни, когда все предыдущее время работал руками ”сказала она” (с) - Майкл Скотт
На следующем месте - монтаж и оборудование: звук и свет. А то мой огромный лоб блестит сильнее чем шары на новогодней елке)
Пишите в комментарии, что еще можно/нужно улучшить. И конечно же, ставьте лайки!
И спасибо всем кто добрался со мной до этой знаменательной даты! Надеюсь, вас станет еще больше!
🔥8