Григорий Дядиченко
Відкрити в Telegram
Разработчик игр, интерактивных стендов и интерактивной рекламы. Эксперт в области интерактивов и XR. 100+ проектов за 5 лет. https://whitelabelgames.ru По вопросам сотрудничества писать: @it_bizdev
Показати більше2 661
Підписники
Немає даних24 години
-37 днів
-930 днів
Архів дописів
2 661
Шейдерная магия в Unity: Красивая погода в играх
https://80.lv/articles/take-a-look-at-this-gorgeous-shader-based-weather-system/#conversation
Разработчик представил красивую шейдерную систему погоды с динамическими осадками (дождь, снег), реалистичными облаками и туманом, плавными переходами между состояниями и эффектами мокрых поверхностей или накопления снега, при этом система оптимизирована, работает без частиц, поддерживает суточный цикл и может использоваться в играх с открытым миром или симуляторах.
#новости
2 661
Про многопоточность и асинхронность
Наткнулся с утра на заметку про многопоточность. Сама заметка мне не особо понравилась. Наверное в основном что там написано "для сеньоров". А для сеньоров она ни о чём, так что ссылку давать не буду. И тезисы из прилегающей к ней подборки статей — тоже. Напишу сам на ту же тему (не для сеньоров).
Многопоточность и асинхронность скажем многие путают.
Простым языком многопоточность нужна в задачах, которые в основном дают нагрузку на CPU. С планом на эксплуатацию в системах где у процессора много ядер (почти любая сейчас). Из плюсов, что в данном случае мы используем процессор максимально эффективно. Поэтому это требуется в CPU-bound задачах. В играх это у нас была бы физика (но есть PhysX), ИИ, генерация мира и иногда игровая логика.
Асинхронность — это последовательное выполнение операций. Оно работает в одном потоке (в контексте юнити логичнее всего что в главном). Асинхронность по сути переключается между задачами без блокировок не создавая новые события, а используя event loop. Чаще всего в Unity это корутины. Если вдруг вы по какой-то причине не знаете как устроен event-loop в Unity то вот ссылка. Как это работает не блокируя поток в корутинах? Создаётся список (а если быть точным итератор) операций, который исполняет операции разбитые yield-ами по ходу исполнения Unity Script lifecycle.
Многопоточность штука удобная. Но к сожалению не доступная из коробки шарповыми средствами для скажем WebGL проектов. Шарповый System.Threading и Unity Job System. Тем не менее в современном вебе есть Web Workers. Они не интегрированы в Unity, так как не поддерживают синхронизацию с главным потоком Unity и с DOM. И всё же через нативные js плагины их можно запускать. Если кому-то интересно, то могу как всегда за 🔥 написать пример использования Web Workers из Unity. На десктопе и мобилках всё работает хорошо. Нужно просто знать как избегать deadlock и race condition. Я обычно использовал её для всяких алгоритмах на графах. У меня был проект с укладкой графа в трёхмерном пространстве и вот она считалась в отдельном потоке.
Асинхронность тоже. Но по сути её есть два вида. Так как корутины по-человечески не умеют возвращать результат исполнения той самой корутины, то часто (да и сам я так пишу) используются коллбэки. У них много недостатков.
1. Ад коллбэков
Глубоко вложенные коллбеки делают код нечитаемым и сложным для поддержки. Советую почитать про термин "Pyramid of doom" в программировании. И нет, вы что, программисты не любят драматизировать.
2. Сложность обработки ошибок
Ломаются трейсы, ломаются логи, нет единого места для трай кетча. Это всегда доставляет неудобства.
3. Инверсия контроля
Коллбэки нарушают линейный поток кода, передавая управление внешней функции. Из-за этого сложно отследить как и когда выполнится код.
Ну критикуешь — предлагай. Но всё уже предложили за меня. Мне в целом нравится UniTask. С ним довольно удобно работать. Тот же async/await подход. Удобный и понятный. Можно конечно пользоваться C# 7.0 async/await, так как в Unity уже давно есть .Net 4.0. Да и UniTask его вроде тоже требует. Так что главное преимущество корутин — это то, что они работают даже с .Net 3.5.
Корутины это что-то вроде урезанного реактивного подхода. При правильной организации классов, там можно как-то жить без коллбэков делая аналоги паттерна DirtyFlag и тому подобное. Но мне запомнилась шутка из одной из лекций майкрософт (не связанная с Unity) — "Давайте напишем async, мы же не животные" (скучаю по временам когда корпорации были не такими беззубыми) :)
#интересное
2 661
URP Sprite Glow
https://dev-game.pro/demos/urp_glow_demo/
Доделано. Шустренький глоу для спрайтов на URP работающий с WebGL, да и где хочешь. Гауссом конечно можно сделать посимпатичнее, но будет дороже, и не шейдер графом. А хотелось, чтобы ассет было легко модифицировать. И чтобы был дешёвый по производительности. Без полноэкранных эффектов и тому подобного.
Демо работы можно глянуть по ссылке. Чуть позже почищу изображения от артефактов. Так как светятся ещё остатки тени под ногами вампира.
В общем и задачку выполнил по игре, так как глоу штука очень полезная для туториалов, да и для выбора перса (у меня же планируется point&click управление). И ассет почти сделал. Осталось только сделать документацию, так как детали с альфой, с экструдом и так далее немного неочевидные на мой вкус. Напишу доку на неделе.
Да, если что исходники доступны для скачивания на бусти. Для второго уровня подписки и выше.
#индиприключения
2 661
+1
Несколько иллюстрирующих картинок бонусом. Первая "как выглядит квад с точки зрения меша". Вторая кусочек шейдер графа для реализации Glow.
Просто стандартные техники вроде полноэкранного эффекта — дорогие. Хотя реализуются проще через bloom. Если обводку делать спрайтом, то как быть с анимированными объектами?
А так, ща добавлю дисторсию (доп. шейдером, чтобы можно было делать прикольную анимированную обводку) и ряд настроек. Сделаю доку по использованию. И в продакшен. Будет первый ассет у тех, кто подпишется на третий уровень подписки на бусти.
#индиприключения
2 661
Продолжаю мучать Glow Outline
Обожаю вспоминать про разные оптимизации юнити. Где-то час я не мог понять что происходит с альфой. Я перепробовал разные варианта её расчёта, но в итоге всё равно получалась ободка с разными артефактами. Альфа обрезалась. И я не мог понять почему. Вот что значит пару лет почти не трогать SpriteRenderer.
А потом я вспомнил. Там же не Quad. там меш, который генерится и это оптимизация. На мобильный платформах, особенно на андроид, всегда была проблема с альфа блендингом при множестве слоёв, если есть много лишней альфы. Я с этим сталкивался ещё в 2015, когда работал над проектом Vector2.
Хорошо, что в настройках Sprite есть ползунок ExturdeEdges. Он решает эту проблему, и нужно просто будет написать про это в документации. А на видео слева спрайт, справа квад.
Хочется ещё добавить дисторш, и настройку вроде Softness, чтобы можно было квад и аутлайн переключать.
#индиприключения
2 661
Зато я точно понял как работает размытие Гаусса
Не то чтобы я раньше не знал. Но было интересно попробовать реализовать его шейдер графом. И в целом можно забить, но так неудобно без циклов и не кодом. Не тот алгоритм чтобы реализовывать. Это скорее был экспериментальный подход :)
Но бусти надо честно отрабатывать. Так что быстрый OutlineGlow не за горами. По сути плагинами для подписчиков я выложу то, что мне и в проекте пригодится. Просто оформлю так, чтобы это были удобные самостоятельные модули. Так что это у нас будет подсветка объектов, верёвки разрубаемые свайпом и динамический 2д свет способный отражаться.
Но раз уже подписчики появляются, подсветку хочется выложить завтра. Не заставлять же первых поддержавших людей ждать :)
P.S. Гаусс в целом не самый быстрый, но шейдер графом учитывая его логику самплирования и "смещения от центра", без циклов этим заниматься скорее забавно. Но я вспомнил ещё пару техник. Буду сегодня тестить.
#интересное
2 661
Как устроены игры?
https://github.com/OTFCG/Awesome-Game-Analysis?tab=readme-ov-file
Отличная подборка материалов по разбору геймдизайна, игровых механик и аналитики. Здесь собраны исследования, инструменты и кейсы, которые будут полезны разработчикам, аналитикам и просто фанатам игр. Прям список литературы на лето для разработчика игр!
#новости
2 661
Я таки завёл Boosty!
https://boosty.to/dev_game
Всем привет! Не прошло и трёх лет (на самом деле прошло), и я решил завести себе бусти. Буду рад если кто-то решит поддержать! А у меня будет больше мотивации всё так же искать самые интересные новости по Unity и создавать авторский контент. Вроде моих статей от том "как сделать билд минимального размера" или длинной истории моей карьеры. Я уже всё-таки больше 10 лет разрабатываю что-либо. И создал много бесплатного контента и репозиториев. С ними кстати тоже можно ознакомиться.
Но помимо того что я уже делаю я кое-что придумал :) Что будет доступно для подписчиков с определённого уровня.
1. Плагины
Все разработанные плагины будут доступны для тех, кто угощает меня фильтр-кофе раз в месяц. С неэксклюзивной лицензией на коммерческое использование. Чистые по правам и так далее. По-моему честная сделка.
Первый плагин на очереди, который я придумал - это быстрый 2d glow для URP работающий в WebGL.
2. Предлагать плагины и получать поддержку
А кто латте угостил, тот ещё получит ответы на вопросы по плагину. И могут предлагать свои плагины. Для этого будут отдельные посты.
3. Разбор проектов
Сразу скажу, что там зависит от масштаба. Нельзя читерить и на огромный проект от компании (название популярной компании) сказать: "У нас тут 100к строк кода, проведи аудит по-братски". Небольшие проекты. Могу даже архитектурку набросать как это было в этом посте.
4. Ваше имя в титрах
Чтож. Я видел у блогеров куда-то имена принято писать. Думаю деньги с бусти пойдут на реализацию моих экспериментальных игр. Так что все кто возьмут самую вип подписку попадут в титры игр.
Число подписок с разборами и консультациями + попаданием в титры ограничено. Так как пока я не нашёл маховик времени, чтобы успевать всё что угодно.
Спасибо за внимание. Пойду разберу рабочие дела и поделаю задачки по игре. А вы подписывайтесь, не стесняйтесь.
#интересное
2 661
Как рендерить траву в играх: теория и оптимизация
https://hexaquo.at/pages/grass-rendering-series-part-1-theory/
В статье "Grass Rendering Series Part 1: Theory" (hexaquo.at) разбираются основы рендеринга травы в реальном времени: проблемы с производительностью из-за большого числа травинок, оптимизации (инстансинг, LOD, процедурная генерация), а также физика (ветер, столкновения) и шейдерные техники для реалистичного освещения и полупрозрачности.
Чёт наткнулся в ночи. Пусть полежит тут. Трава штука довольно часто применимая. Когда делается любая 3д локация на улице, то она от такого прям оживает. В моём случае это обычно визуализации заводов и всяких производств для выставок. Не люблю когда картинка мёртвая, даже если такие детали это явно не центральный объект, уметь делать всё равно полезно. Сохраним. Поделимся. Будем следить. Так как только первая статья из цикла.
#новости
2 661
День 2.1 Ежедневные бонусы за вход
你好! 你好吗? Утро у меня обычно начинается с того, что я листаю новости на прогулке, слушаю аудиокнигу (иногда) и собственно учу китайский. И самая настойчивая зелёная сова не забывает мне напоминать, чтобы я поучил немного иероглифоф. Причём когда я начинал учить 中文 (Китайский) не было вариант русско-китайского изучения. Только русско-английский. Так что за одно пытаюсь вспоминать куда ставятся артикли.
И у этой совы есть механика стриков. Ниче нового в геймдеве ей 100 лет в обед. Но я подумал может засунуть награды за ежедневный вход куда-то в игру для ретеншена. Неплохая механика удержания. Вообще надо подумать что игрок может покупать, чтобы сливать валюту, и при этом не утонуть в миллионе промтов. Строить мотивацию на скинах и шапках не хочется. Я придумал точкой траты абилки (по сути читерство, чтобы пройти уровень 3 секунды полной темноты «Время ночи» и «Хронокровь» остановка времени). Тратим валюту чтобы их открыть, тратим валюту чтобы их юзать. Но будто в наградах должна быть не тупо валюта, а ещё что-то.
Пока думаю что надо придумать третью абилку, которая даётся только за 7 дней подряд ежедневного входа, чтобы D7 ретеншен поднять. Просто ещё пока я вижу пару проблемных решений над которыми надо подумать.
1) Капли крови (звёздочки по сути) это так же и валюта, которую мы можем удвоить за просмотр рекламы в конце уровня. И получить в магазине за просмотр рекламы.
И баланс валюты надо будет посчитать, но вообще будто бы сложнее это пользователю объяснить. Нужно будет грамотно сделать интерфейс, чтобы это было очевидно.
2) Капли крови тратятся на использование абилок. Вообще и нарративно логично, и интерфейсно понятно как сделать, но надо плейтестить. И легко балансировать для казуальных игроков.
Проблему я вижу в мотивации к хардкорных игроков, которым способности и подсказки юзать по статусу не положено. А если основная точка траты валюты — это абилки. Тратить валюту им некуда.
#индиприключения
2 661
Анализ проекта с Project Auditor
https://dev.to/attiliohimeki/unity-project-analysis-with-the-project-auditor-2pea
Юнитеки сделали статический анализатор проекта? Что-то я это упустил. Штука полезная, а что это такое? Unity Project Auditor — бесплатный инструмент для анализа проектов в Unity. Он сканирует код, ассеты и настройки, выявляя проблемы производительности: неоптимальные скрипты, дубликаты текстур, некорректные настройки физики и графики.
В статье собственно разбор его функционала. Очень полезная штука чтобы искать косяки и проводить финальную оптимизацию перед релизом, так как без такого легко упустить мелкий косяк. В стиле не отключенных мипмап в спрайте которые используется только для интерфейса.
#новости
2 661
Чуть почистил подписчиков. Вообще надо поискать нет ли бота который банит ботов в подписчиках по подобному фактору. Через интерфейс я вижу только часть подписчиков. А через апи думаю можно глянуть больше. Ну и кто-то начал отписываться, так как я вернулся, а про мой эксперимент читать неинтересно :)
2 661
+3
День 1.3 Тёпленькая пошла
Итак, и вот пошла самая сложная часть. Начинаем мучения с артом. Пока треш, угар и содомия. Надо видимо определить палитру и отрисовать маски, которые потом нейросеть добьёт. Пробую процесс "отдельные гейм ассеты и коллаж". Идея процесса по шагам.
0. Берём и мучаем дипсик чтобы он написал нам промт, который будет выдавать концептуальный стиль того, что мы хотим.
1. Генерим картинки пока не начнёт получаться стабильно нужный стиль.
2. Просим дипсик разбить промты на отдельные для игровых ассетов.
3. Генерим отдельные ассеты и совмещаем их в фотошопе, чтобы посмотреть как они друг с другом дружат. И собираем "уровень".
Преимущества подхода. Можно допиливать каждый конкретный ассет. Я считаю что генерить целиком картинки и локации подходит только для кат сцен и визуальных новелл.
Недостаток. Нужно следить за единообразием стиля, цветовой гаммой и тому подобным. Вот сейчас на собранной вместе картинке "кто в лес, кто по дрова. Там проблемы со всем. Стили, пропорции, цветовая гамма. Но это так сказать с наскока.
Наблюдение. Дипсику на паллитру в целом наплевать. То есть промт генерил одно. Но дипсику плевать, он просто "придумал цвета" вне зависимости от того сочетаются они или нет. Наверное я выпишу все промты. Сделаю паллитру, чтобы у персонажа и игровых объектов было достаточно контраста с фоном. Забью в промты нужные цвета. И попробую на второй заход.
В общем чтобы сделать хотя бы "адекватный", я уж не говорю хороший результат с нейросетями — это явно не нажать на пару кнопок. Нужны навыки фотошопа, понимание и насмотренность в дизайне. Понимание концепций дизайна.
#индиприключения
2 661
День 1.2 Архитектура
Ну и конечно же до того как писать код лучше составить схему архитектуры. Тут по сути не хватает геймплея, но мне он будто и не нужен, ток в сессию добавить какой-нить GameplayManager, который будет бросать события прохождения уровня и так далее. Чтобы уровни были изолированы.
Сам геймплей будет весь на декораторах, там не так интересно рисовать общую схему.
Итак, а что у нас по основной архитектуре. Так сказать подсветим фишечки. И первое "спорное" решение SessionController.
В данной архитектуре SessionController — это по сути синглтон сервис локатор. Да, можно было бы ща расписать какую-то DI версию с более грамотным IoC контейнером. Но для маленького проекта, а зачем? В чём-то небольшом подобные архитектуры меня никогда не подводили. Удобно бустрапить, подменивать реализацию сервисов через директивы препроцессора и так далее.
IStorageConfig, ITransactionProvider, IAdsProvider — единственные места где я вижу разумную подмену реализации. Разные сдк разных платформ. Ну и магазином может захочется не локально управлять, а с сервера. Часто люди пишут всё на интерфейсах, даже там где смысла в этом нет, я такое не люблю. Поэтому только три интерфейса.
Если есть какие-то вопросы по схеме можно задавать в комментах. Продолжаем работу. Ну и как всегда ставим 🔥, не стесняемся!
#индиприключения
2 661
День 1.1. Анимация персонажа в Runaway
Я в итоге решил взять вариант 6. Он пока и побеждает, и я не прощу номеру 3 приклеенные к крыльям уши. Собственно решил попробовать по анимировать в Runaway. Даже первые деньги можно сказать вложил. 1299 рублей на подписку на него.
Итак, выложу сначала то что в можно попробовать пустить в работу. А потом «неудачные дубли». И это важно, так как по сути одна генерация в Runaway стоит 22 рубля. И совершенно неважно удачная она или нет.
Вывод эксперимента с Runaway. Какой-то результат там получить легко. Конкретный сложно. Мне не нравилось что при ходьбе персонаж не моргает. Поэтому я перегенировал ходьбу много раз. Из последнего варианта (что прикреплён к посту) может слеплю каким-то макаром что-то в секвенции. Так что ffmpeg и фотошоп будут ждать меня.
Айдл с первого раза получился неплохой, хотя «топанье ножкой» кажется будет меня бесить. Но экономим, не тратим кредиты пока в нейросети. Соберём с этим. Надо посмотреть ещё на сколько эти «лупы» в реальности лупы. Ну сегодня буду уже движок открывать, так что заодно проверю.
#индиприключения
2 661
А зачем мне это?
Думаю стоит написать: «А зачем мне вообще этот проект?». Человек который умеет в сложные шейдеры, в вышмат, в графику, в трекинг объектов и компьютерное зрение. Занимался супер сурьёзными задачами для медицины, промышленности и т.п., где у компаний есть даже патенты моих математических моделей, теперь решил сделать казуальную игру на странную платформу с непонятной монетизацией. А для чего?)
1. Тест производства контента нейросетями
Я уверен, что нейросети — это путь 1001 компромисса. Ты не делаешь с нейросетями то, что ты хочешь сделать. Ты делаешь то, что ты можешь сделать. И я хочу в этом убедиться. Собирать барьеры в аутсорс проектах адекватного калибра — непозволительная роскошь. Так как там важной задачей выдавать результат. Мы с этим экспериментируем в некотором масштабе, но качество важнее всего.
А на кошках можно посмотреть. Собрать шишки. Подумать над применимостью того или иного инструмента. Поискать интересные технологии продакшена.
2. Свободное время
Рынок в этом году дохленький. Именно аутсорс. Не знаю я ли один это ощутил, хотя по общению с коллегами по цеху я не одинок. Желания, бюджетов, времени, даже при учёте навыков, закапываться в крупный проект с высокой степенью рисков у меня нет. А игры, серьёзные игры, это всегда высокая степень риска. Именно поэтому из всех путей в качестве основной деятельности я выбрал аутсорс и b2b заказы.
При этом хочется уметь монетизировать своё свободное время.
3. Вдруг я ошибаюсь в площадке
Понятное дело, что я взрослый человек из продакшена с опытом. И перед тем как принять решение что-то делать я изучил доступные материалы по площадке. И люди рассказывают про доходы в 1к рублей, про 80р в день, про 15к рублей в месяц. Что звучит не особо впечатляюще. Но я смотрю на проекты с точки зрения опыта в хороших играх. И «я это сделаю за день, но возможно мне будет стыдно».
Хочется сделать просто несколько приличных проектов, которые я в случае того, что собранная информация про площадку не зависит от качества контента, я смогу использовать в качестве маркетингового инструмента. Рынок ща в плачевном состоянии, но не сидеть же и плевать в потолок — надо чем-то заниматься.
Вот по сути для чего я вообще с этим затеялся. Как и с публичным блогом по реализации. Так как мне кажется проект будет минусовый в сухом остатке по деньгам, но из него можно вынести другую пользу, которая отобьёт часть потраченного на это времени и ресурсов.
А то я уже думал может на работу пойти от безделья. Так как время свободное есть. В него я привык зарабатывать. И в целом экспертизы много. Но думаю, что мне в найм не консультантом путь уже заказан :) И даже начав искать я вряд ли найду что-то мне подходящее :)
#индиприключения
