Григорий Дядиченко
2.66K subscribers
483 photos
191 videos
10 files
1.34K links
Разработчик игр, интерактивных стендов и интерактивной рекламы. Эксперт в области интерактивов и XR.

100+ проектов за 5 лет. https://whitelabelgames.ru

По вопросам сотрудничества писать: @it_bizdev
Download Telegram
Руководство для Unity-разработчика: Модульное тестирование
https://habr.com/ru/companies/otus/articles/913906/

В статье на обсуждается тестирование проектов на Unity: автор рассказывает о важности автоматизации тестирования игр, рассматривает модульные (Unit), интеграционные и UI-тесты, а также инструменты вроде Unity Test Framework и NUnit. И о том что сквозные тесты не нужны.

А помогает ли тестирование в разработке? В Unity проектах TDD в целом не особо в ходу по моему опыту. Исследований по геймдеву на эту тему особо нет, но есть старое исследование от Майкрософт. Основные тезисы в нём, что внедрение занимает на 15-35% времени больше, но при этом багов становится меньше на 40-90% выпускаемых в релиз. Неплохо.

В играх тестирование полезно, но думаю только в крупных. В остальных случаях тут вопрос даже не времени разработки, а поиска и обучения специалистов которые умеют в TDD. Это очень важный фактор, так как я сменил технологический стек одного из своих проектов потому что просто не мог найти разрабов под эту историю. Их нужно было либо растить самому, либо ооочень долго разыскивать. И тут та же история, что нужно помимо общего «лучше» учитывать контекст, что в Unity разработке тестирование никогда не было стандартом индустрии. От чего найти разрабов которые умеют в TDD, умеют быстро с этим работать и понимают принципы — сложно.

#новости #Unity #GameDev #Тестирование #AutomatedTesting #CI_CD
🔥9
Генерация контента с помощью ИИ "за пять секунд"

Чёт последнее время начал натыкаться на кучу роликов с генерацией контента "в два клика" или "за 5 секунд". Типа с нейросетями так просто делать контент и вообще всё классно, ну и вот вам урок.

Я никогда особо не любил кликбейты. Даже в статьях на хабре может быть у меня довольно пресные заголовки. И не исключаю что я чего-то не знаю, какой-то чудесной кнопки "сделать красиво". Но расскажу про свой опыт нелёгкой борьбы с нейросетями. Но сначала поговорим о плюсах.

1. Качество поражает

То какие можно делать картинки и мультики, иконки, графические ассеты. Кайф. В отдельности они выглядят шикарно. Тут в посте слишком много буков чтобы телеграм дал в шапку поставить картинку, но вот для СММ и соц. сетей... Бедные иллюстраторы. Если раньше я криво косо фотошопил обложки. То сейчас промт + фотошоп позволяют делать красиво. Так сказать нейросети дали мне кнопку "сделай красиво" для этой задачи.

2. Скорость и отсуствие коммуникации

Любой человек кто менеджерил арт, кто занимается продакшеном знает. На итерации правок и какие-то мелкие доработки может уходить уйма времени. И художнику очевидно нужно время чтобы нарисовать Х. Но помимо этого нужна "сыгранность" команды и умение объяснить художнику чего бизнес от него хочет. И это навык. С нейросетями эта часть действительно ощутимо и проще, так как итерация занимает пару минут. Для чего-то простого можно генерить кучу вариантов довольно шустро.

Ну и на этом пожалуй всё что я выделил для себя. А теперь "о нюансах".

1. Это далеко не так быстро как все расписывают

В следующем посте я может расскажу про конкретный небольшой пет проект, который я делал нейросетями в соло. Но условно у меня стояла две задачи. Сгенерировать колоду карт и сгенерировать для них рубашку. Я в основном пользуюсь Stable Diffusion XL. И если для колоды я написал генератор на Unity, то рубашку сделал в нейросети. И это заняло у меня 1,5 часа. То есть я перебирал промты и искал метод как получить результат для одной картинки достаточно долго. И если генерировать целый скин для игры, то это может спокойно занять скажем 3-4 недели. Поэтому это далеко не так быстро как пишут в кликбейтных роликах.

2. Авторское право

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

3. Очень тяжело добиться консистентости

Держать стиль не то чтобы нереально, но это то что отнимает больше всего времени. И это проблема если пытаться сделать что-то по-настоящему качественное. Нужно экспериментировать с LoRA и с ControlNet чтобы получать нужный результат.

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

 #ии #мысли #Unity
10🔥16❤‍🔥3
Unity 6 tips: Combine Meshes
https://www.youtube.com/watch?v=vPhRADmT-zs

Кто-то пустил маркетологов в советчики? Охххх, на сколько же опасно давать такие советы. В целом это может быть правдой. В определенном контексте. Но джуниор разработчики люди творческие. По себе помню, когда я какого-то подрядчика ругал за new SomeData внутри цикла, так как не разбирался в памяти, куче и стеке. И по привычке из плюсов new - это в среднем зло 🙂 А оказалось потом, неожиданно, что когда SomeData это структура, то там аллоцируется на стеке и это условно ничего не стоит (ну к фризам из-за памяти и фрагментации хипа не приводит точно, так как куча не задействована). Но это и было 9 лет тому назад :)

И вот этот видос мне показался чем-то подобным. Рассказали про функционал. Классно. Для тех кто не знал. Даже не обязательно погружаться в детали и контекст рендера. Но это не совет, это обзор функционала. Потому что для этого надо понимать ответ на вопрос. Представим вы делаете экшн рпг и у вас огромный замок. Почему весь замок мы не можем сделать одним мешем? Ну типа даже мы проходим по ограничению на число вертексов, у нас не самый высокополигональный замок. Почему если в нём много комнат и мы находимся внутри, а не снаружи, так делать объективно плохо?

Потому что вы тихо сказали шине гпу - жри. Ладно там в шейдерах вам поможет фруструм куллинг хотя бы с фрагментными шейдерами. Но вы всю модель, кусочек которой вы видите, потянете грузить в видеопамять. Помню как впервые столкнулся с этим в VR используя MeshCombiner ассет, и объединив всю сцену в единый меш. Но тогда я даже не мог осознать почему стало медленее.

А сам функционал конечно полезный и прикольный. Просто о нем стоит знать и быть с ним стоит быть осторожным) Там есть ещё пара приколов с которыми можно столкнутся, когда у вас шейдеры задействуют текстурное смещение или типа того, но это интуитивно более понятный момент, чем то что вытекает из принципов работы GPU.

Стандартный меш загружается целиком. Вы не можете загрузить в VRAM только часть его вершин произвольным образом. GPU работает с мешами как с едиными объектами данных. Если вы видите часть одного объекта (например, половину дома), это означает, что его bounding box попал во фрустум. На GPU будет отправлен весь меш дома, обработаны все его вершины вершинным шейдером, но отрисованы (растеризованы) будут только те треугольники, которые прошли тест глубины и попали в экранные границы.

#новости
🔥8
Стратегия Unity по рендер-пайплайнам на 2026 год
https://discussions.unity.com/t/render-pipelines-strategy-for-2026/1710004

В 2026 году Unity упростит работу с конвейерами рендеринга: сделает акцент на развитии URP (повышение производительности, стабильности и визуальных возможностей), поддержит HDRP для Nintendo Switch™ 2 и начнёт процесс убийства встроенного конвейера рендеринга.

Тред стоит почитать целиком. Если коротко: URP получает основное развитие — производительность, время сборки, 3D-освещение.

#новости #unity
🔥7
Задачка - Исполнение корутин

Давайте попробуем что-то новое. В этом году у меня есть легкое вдохновение на тему блога, поэтому попробуем новую рубрику. Отвечать можно реакциями, так и пойму интерес к рубрике.

Что выведет этот код в Unity?

void Start()
{
StartCoroutine(A());
Debug.Log("3");
}

IEnumerator A()
{
Debug.Log("1");
yield return null;
Debug.Log("2");
}

Варианты:
а) 1, 2, 3 - 🤷‍♂️
б) 1, 3, 2 - 🤷‍♀️
в) 3, 1, 2 - 🤷

Ответ завтра 🙂 Если будет интерес, то буду публиковать такие с разной сложностью чисто для разминки мозгов. Это не самая сложная на понимание корутин. Думаю такое прикольно чисто как жевачка для мозгов. А то скоро за вас всё ИИ агенты будут придумывать 🙂 Эмодзи подбирались, чтобы они не давали подсказок 🙂 Ну и огоньки тоже можно поставить

#задачка #unity
🤷‍♀80🔥10🤷5🤷‍♂2
Григорий Дядиченко
Задачка - Исполнение корутин Давайте попробуем что-то новое. В этом году у меня есть легкое вдохновение на тему блога, поэтому попробуем новую рубрику. Отвечать можно реакциями, так и пойму интерес к рубрике. Что выведет этот код в Unity? void Start() {…
Ответ на вчерашнюю задачку: б) 1, 3, 2

StartCoroutine запускает корутину. Она выполняется до первого yield return и возвращает управление. То есть Debug.Log("1") выполнится сразу, потом yield return null приостановит корутину, выполнится Debug.Log("3"), и только в следующем кадре — Debug.Log("2").
Корутины это НЕ потоки. Они работают в main thread. yield return null — это "продолжи в следующем кадре". Это было что-то очень простое. Завтра закину посложнее. Чем можно людей на собесах пытать 🙂

#задачка #unity
❤‍🔥94🔥3
Задачка: что не так с этим кодом?

Пойдём дальше по каким-то типичным базовым задачкам. В целом этот вопрос хоть и простой, но довольно неплохая проверка на опытность.


void Update()
{
transform.position += Vector3.forward * speed;
}


Код работает, враг двигается. Но есть проблема которая проявится на разных устройствах. Какая?

Варианты:
а) transform.position нельзя менять напрямую - 🤷‍♂️
б) Ошибка в формуле - 🤷‍♀️
в) Нужен Rigidbody для движения - 🤷

#задачка #unity
🤷‍♀46🤷‍♂6🤷2
Ответ: нет Time.deltaTime

Как многие правильно ответили. Без deltaTime объект двигается на speed единиц каждый кадр. На 30fps — 30 единиц в секунду. На 144fps — 144 единицы в секунду. Скорость зависит от fps.


// Правильно:
transform.position += Vector3.forward * speed * Time.deltaTime;


deltaTime — время прошедшее с прошлого кадра. Умножая на него, получаем движение в единицах за секунду, независимо от fps.

Этот баг был даже в игре по франшизе. Woody Woodpecker: Escape from Buzz Buzzard Park — на слабом компьютере игра работала нормально, а на новом Вуди носился по экрану со скоростью света. Разработчики привязали скорость к кадрам, и чем быстрее железо — тем быстрее персонаж. Классика.

Тут можно ещё в режиме прохождения собеседования докопаться до третьего варианта. Так как главный верный ответ дельта тайм, как почти все и ответили. Но самый верный подход на собесе, когда разобрались с таймом, вопрос "а на объекте есть коллайдер? Если да, то нужен rigidbody, а с перемещением Rigidbody лучше работать в методах RigidBody, чтобы физика работала корректно". Не обязательно, но плюсик в карму об этом подумать. Задача на собеседовании показать максимум того что вы знаете.

#задачка #unity
❤‍🔥8🔥4
Path tracing в URP
https://github.com/Kuan-Mi/UnityPathTracing

Нашёл интересный репозиторий — реализация real-time path tracing в Unity URP. Не просто "пустили лучи", а полноценный стек: DXR-пайплайн, шумоподавление от NVIDIA (REBLUR, SIGMA), DLSS Ray Reconstruction, SHARC для кэширования радианса. И всё это работает с динамическими сценами включая скиненные меши.

Что меня зацепило — поддержка VR режима. Path tracing в VR это отдельный круг ада с точки зрения производительности, и то что кто-то это вообще пробует — уже интересно.

В планах у автора ReSTIR DI и объёмное освещение.

#интересное #unity #шейдеры #рендеринг
❤‍🔥9🔥4
Unity официально поддерживает Steam
https://app2top.ru/news/dvizhok-unity-ofitsial-no-nachal-podderzhivat-steam-238839.html

Занятная новость с GDC. Unity наконец-то официально поддерживает Steam — до этого разработчики годами интегрировали Steamworks руками сами, без какой-либо официальной поддержки со стороны движка. Работало, но костыльно.

Теперь есть Platform Toolkit, нативная поддержка SteamOS и Steam Deck. Плюс обещают регулярно обновлять Linux runtime — чтобы не нужен был Proton.

Честно говоря немного смешно что это случилось только сейчас. Steam — крупнейшая PC-платформа, Unity — один из главных движков для тех же инди. Они просто... не были официально интегрированы. Все просто делали вид что всё нормально 🙂

Ещё интересная деталь: упомянули интеграцию с Fortnite, но подробностей нет. Напомню — в конце прошлого года Unity и Epic неожиданно объявили о партнерстве. Будем посмотреть.

#новости #unity
🔥13
This media is not supported in your browser
VIEW IN TELEGRAM
Клеточные автоматы с несколькими окрестностями на Compute Shaders
https://www.reddit.com/r/Unity3D/comments/1s2sh1u/multiple_neighborhood_cellular_automata_using/

Обычный клеточный автомат — например Game of Life — смотрит на 8 соседей вокруг клетки. Включить или выключить — решает простое правило.

MNCA (Multiple Neighborhood Cellular Automata) делает иначе: вместо одной окрестности — несколько концентрических колец на разных радиусах. Каждое кольцо имеет свой вес. Результат — не пиксельная сетка, а плавные органические структуры которые выглядят как что-то живое. Митоз, рост грибницы, нейронные связи.

На CPU это не запустить в реальном времени — слишком много вычислений на каждый пиксель. Компьюты решают проблему: каждая клетка считается параллельно на GPU.

Из тех вещей которые смотришь и думаешь "как это вообще работает" — а потом разбираешься и оказывается что математика там элементарная, просто применённая красиво.

#новости #unity #шейдеры #алгоритмы
🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
Анимация поверхности воды в реальном времени на Unity
https://80.lv/articles/this-enchanting-water-cross-section-was-created-in-unity

Sakura Rabbit снова. Если не знаете — один из моих любимых Unity-разработчиков, делает визуально безупречные вещи.

На этот раз — лесное озеро с анимацией поверхности воды. Выше — туман и атмосфера, ниже — камни, растительность, лучи света проходящие сквозь воду.

У сакуры в портфолио ещё куча подобного — динамические капли дождя, складки ткани в реальном времени, эффект в стиле Venom, каблуки которые адаптируются к высоте персонажа. Если не следите — советую.

#находка #unity #шейдеры
🔥29❤‍🔥2
Отладка Color LUT в Custom SRP
https://catlikecoding.com/unity/custom-srp/6-1-0/

Когда настраиваешь color grading — хочется видеть что именно происходит с LUT-текстурой. Раньше единственный способ подсмотреть — лезть в Frame Debugger. Неудобно.
В этом обновлении в Rendering Debugger добавили переключатель Show Color LUT. Включаешь — и внизу экрана появляется полоска с текущей LUT-текстурой камеры. Работает и в редакторе, и в билде.

Под капотом — отдельный шейдерный проход, который вручную строит прямоугольник прямо в clip space из шести вершин. Высота полоски масштабируется по разрешению LUT (16/32/64), чтобы пропорции не ломались. Никакого меша — только SV_VertexID и математика.
Заодно починили старый баг: если камера рендерила в RenderTexture-ассет, картинка уходила в никуда. Теперь рендерер проверяет camera.targetTexture и использует его напрямую, если он задан.

Небольшой туториал, но из тех что учат думать о дебаг-инструментах как о полноценной фиче, а не afterthought.

#unity #srp #шейдеры #renderpipeline
🔥4
Задачка: три паттерна корутин


// А
IEnumerator Loop()
{
while (true)
yield return new WaitForSeconds(1f);
}

// Б
private WaitForSeconds _wait = new WaitForSeconds(1f);
IEnumerator Loop()
{
while (true)
yield return _wait;
}

// В
IEnumerator Loop()
{
while (true)
yield return null;
}


Какой из паттернов аллоцирует при каждой итерации цикла?

Варианты:
а) Все три — любой yield return создаёт нагрузку на GC, разница только в частоте - 🤷‍♂️
б) Только А — Б и В эквивалентны по аллокациям между итерациями - 🤷‍♀️
в) А и В — Б единственный который не аллоцирует повторно - 🤷

Ответ вечером 🙂

#задачка #unity #оптимизация
🤷‍♀29🤷11🤷‍♂5
Ответ: б) Только А — Б и В эквивалентны по аллокациям

new WaitForSeconds(1f) внутри цикла создаёт новый объект на heap при каждой итерации. Раз в секунду — новый объект, GC копит мусор.

Б: объект создаётся один раз в поле класса, дальше каждый yield передаёт один и тот же экземпляр. Ноль аллокаций в цикле.

В: yield return null приостанавливает корутину до следующего кадра без каких-либо аллокаций.

Паттерн кэшировния работает для всех встроенных yield-инструкций:


private readonly WaitForSeconds _wait1sec = new WaitForSeconds(1f);
private readonly WaitForEndOfFrame _waitFrame = new WaitForEndOfFrame();
private readonly WaitForFixedUpdate _waitFixed = new WaitForFixedUpdate();


Мелочь, но на горячих корутинах которые рестартуют часто — ощутимо.

#задачка #unity #оптимизация
🔥19
Shrink Your Build: отключаем физику в Unity 6.3
https://medium.com/@lemapp09/adaptive-development-shrink-your-build-a5d85798e14c

В Unity 6.3 появился официальный способ полностью отключить физический движок при сборке — PhysX или Box2D. Раньше это тоже было возможно через удаление пакетов в Package Manager, но требовало ручной работы и могло аукнуться ошибками компиляции.

Теперь в Project Settings > Player > Global Settings > Optimization есть параметр Physics Runtime. Ставишь None — и при следующей сборке физическая библиотека вырезается полностью. Несколько мегабайт долой, FixedUpdate больше не тикает, буферы под коллизии не выделяются. Для WebGL и мобилок — ощутимо.

Если физика не нужна, взамен OnCollisionEnter и Raycast используем обычную математику. Проверка расстояния через Vector3.Distance или sqrMagnitude вместо коллайдеров — для UI-игр, карточных и головоломок это и быстрее, и честнее.

#unity #optimization #webgl #gamedev
🔥17
This media is not supported in your browser
VIEW IN TELEGRAM
Объёмные облака в URP
https://github.com/mur1q/VolumetricCloudsShader-Unity

Нашёл простой, но приятный репозиторий — реализация объёмных процедурных облаков в Unity URP. Основа — raymarching + FBM-шум для формирования формы. Поддерживает многоцветные облака, всё генерируется в реальном времени.

Автор сам говорит, что это его первый опыт с volumetric rendering — и для старта выглядит вполне достойно. Есть живое демо на itch.io, можно пощупать прямо в браузере.

Из интересного — использует академическую статью с ICCS 2024 как референс, рядом с классическими шейдерами с ShaderToy. Такой микс теории и практики в учебных проектах встречается нечасто.

#интересное #unity #шейдеры #рендеринг
🔥24
Живой огонь в реальном времени — как это устроено в Ignitement
https://unity.com/blog/real-time-fluid-simulation-fire-vfx-ignitement-breakdown

Соло-разработчик Sørb написал гостевой пост о технической начинке огня в своей игре Ignitement. И там есть на что посмотреть.

Вместо классических партиклов — полноценная 2D fluid simulation в реалтайме. Работает через Graphics.Blit, обновляет несколько текстур (density, velocity, temperature, reaction) и намеренно использует fragment shaders вместо compute — ради широкой совместимости.

Рендеринг огня построен на reaction texture как heightmap с parallax-эффектом. Дым — из temperature. Искры — GPU-частицы, которые сэмплируют velocity field и естественно следуют потоку воздуха. Всё самописное: никакого Shuriken, никакого VFX Graph.

Особенно интересно с освещением: reaction texture даунсэмплится в динамический light map. Один texture lookup в шейдере с небольшим сдвигом по нормали — и среда выглядит так, будто её реально освещает огонь. Тот же light map используется в UI и даже для деформации «стен из плоти» в вертексном шейдере.

Симуляционные данные не остаются на GPU: через AsyncGPUReadback они уходят на CPU и влияют на геймплей напрямую.

Из ограничений — всё 2D, вертикаль лишь приближение. Но это осознанный трейдофф: быстро, дёшево, работает везде.

Честный технический разбор от инди-разработчика, где VFX, геймплей и UI держатся на одной системе.

#unity #шейдеры #рендеринг #геймдев
🔥11
Unity AI Open Beta
https://discussions.unity.com/t/unity-ai-s-open-beta-now-live-for-unity-6/1718560

Unity выкатила открытую бету ИИ-инструментария для Unity 6. Под капотом есть на что посмотреть.

Трёхрежимная система: Ask, Agent и Plan Mode — последний заточен под геймдев: берёт размытую идею, превращает в план и выполняет длинные инструкции от начала до конца.

Ключевые фичи:
• Skills — модульные блоки под разные области Unity, можно создавать свои
• Checkpoints — точки отката одним кликом: весь стейт кода и ассетов возвращается назад
• Тегирование ассетов — сгенерированное можно найти и заменить перед релизом
• AI Gateway + MCP-сервер — внешние агенты подключаются прямо в Editor, управление из IDE или любого LLM-приложения

Ну главный вопрос умеет ли оно верстать. Так как уже надоело вводить свои языки разметки для клода web-like, чтобы верстать интерфейсы. Хотя последнее время я и в Unity меньше чего-то делаю, так как нет необходимости.

#unity #gamedev #ai #инструменты #геймдев
🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
Frosted PBR Glass Shader for Unity URP
https://www.reddit.com/r/Unity3D/comments/1t72eve/frosted_pbr_glass_shader_for_unity_urp_with/

Mirza Beig продолжает итерировать шейдер стекла для URP — теперь с блюром, маскированием и PBR.
Шейдер покрывает сразу несколько сценариев: матовое стекло с рассеиванием, маски для логотипов и узоров, мокрые и металлические поверхности, лёд, витрины, окна.

Ключевые фичи:
• Scattering/blur — реалистичное рассеивание света через стекло
• Masking — накладываешь маску и получаешь логотип или паттерн прямо на поверхности
• PBR — спекуляр, металлик из коробки

Интересно наблюдать за автором — он методично от версии к версии доводит один инструмент, а не бросает на полпути.

#unity #urp #shader #gamedev #геймдев
🔥7❤‍🔥1