JGD | Блог о геймдеве


Kanal geosi va tili: Belarus, Ruscha


Делаю игры и пишу тоже
Для связи: @stelf
Instagram: http://instagram.com/a.vasylevskyi
Facebook: https://m.facebook.com/anton.vasilevsky.7
TikTok: https://www.tiktok.com/@a.vasylevskyi

Связанные каналы

Kanal geosi va tili
Belarus, Ruscha
Statistika
Postlar filtri


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
Алгоритм побудови залізничної колії на рушії PlayCanvas. Повністю написаний за допомогою ChatGPT. Але щоб ви не думали, що це так просто, це зайняло декілька днів і безліч діалогів/правок та декілька годин пошуку багів. Певен, що власноруч писати таке зайняло б може в два рази більше часу, але це не точно.


За порадою з ютуб погрався трохи з пост-процесінгом, а саме з Tonemapping обробкою. Цей ефект вимагає підтримки HDR, але його легко увімкнути в налаштуваннях URP. Ефект Tonemapping робить щось типу перестановки кольорів з одного спектру або палітри на іншу. Саме з ACES кольори виглядають більш кіношними, а також збільшується контраст зображення та змінюється баланс світла. Я це зрозумів саме так, але можу помилятися, бо технічні деталі досить важко було зрозуміти. Не знаю наскільки буде зручно працювати з текстурами, бо фінально вони можуть виглядати інакше ніж «на бумазі», але цей ефект можна легко відключати за необхідністю, бо працює він з фінальним зображенням і впливає лише на камеру сцени.


Unite

Сегодня вечером прошла ежегодная конференция Unite 2023 в Амстердаме. Показали следующую версию Unity и новые сервисы для разрабов.

Что нового в Unity 6
(да-да, не 2023)

На конференция показали демку, где простым включением фичей новой версии улучшается перфоманс. Много новых слов вроде GPU vertices occlusion, GPU resident drawer, Spatial-temporal post-processing позволяют без особых затрат повысить фреймрейт игры. Из интересного GPU vertices теперь умеет оптимизировать рендер объектов закрываемых другими модельками в кадре. Ну а самым эффективным на демке был GPU resident drawer, хотя принцип его работы не совсем понятен, каким-то чудом он резко снижает количество батчей. Все эти штуки доступны как в URP так и HDRP пайплайнах.

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

Сервисы

Unity теперь предоставляет сервисы Safe Voice и Moderation, которые с помощью нейронных сетей позволяют уменьшить токсичность в онлайн играх. Прикольная вещь и неожиданно что об этом заботятся, как сказал человек на презентации, что-то около 67% игроков покидают игры столкнувшись с токсичным поведением.

Много внимания уделили Unity Muse. Это такой набор сервисов для AI генерации ассетов и других прикольных вещей. Во время демки показали генерацию текстур, а вот судить Muse Chat и Muse Sketch можно только по видосам, хотя сказали что ранний доступ к этим сервисам уже открыт. Sketch например позволяет создавать анимации по текстовому описанию, по названию думаю понятно что это скорее для прототипирования. А Muse Chat умеет писать код и отвечать на вопросы, в принципе как альтернатива подписки на Chat GPT может быть окей, но вряд ли вы GPT использовали только для помощи с Unity.

Упомянули так же что помогут в случае судебного разбирательства, если ваша игра нарушит чьи-то авторские права, это лол конечно.

Так же рассказали про Unity Sentis, это еще один сервис позволяющий создавать свои варианты применения обучаемых моделей, например для диалогов NPC, освещения (даже видос показали) или просто умного поведения персонажей. Вся эта штука работает локально на девайсе, звучит круто по-моему.




Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
В релиз?


По графу можно примерно понять принцип работы шкалы заполения. По сути он происходит в три этапа: вначале мы считаем тайлинг с использованием размера объекта на сцене и умножаем на нашу настройку плостности. Дальше тайлинг применяется и заполняется цветом по шкале на основе текстуры шума. В конце это просто смешивается с рамкой, граф которой я тоже уже показывал отдельно.


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


ResizableCursorShader.unitypackage
31.8Kb
Поделюсь исходником материала с шейдером. Внутри текстура аля Perlin Noise, вместо которой можно использовать другие вариации.


Разрушение построек


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
Сделал ещё такой вариант


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
А как вам такой шейдер?


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
Сделал такой вот бублик для выбора построек. Его часто используют как способ выбора предметов/оружия в играх.

Мучался с разными вариантами реализации направления движения мыши. В итоге самим приемлимым оказался нормализовать вектор движения мыши и умножить на максимально допустимую длину движения.

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

Ну а моим навыкам пиксель-арта и художественному вкусу завидовать не приходится, но я еще учусь!

Поделюсь кодом этой прелести - Selection Wheel Script. Настоящий скарб, если хотите. Может секономить пару дней прототипирования.


Вам не душно от последних постов?


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


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
Про коллизию и дальность прорисовки инстанс рендера. Для прорисовки каждый объект попадает в чанк небольшого размера. В каждом чанке есть список мэшей, которые будут отрисованы с одинаковым материалом. Помимо обычного материала, есть прозрачный, который используется когда чанк сменяется с видимого на невидимый.

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

Коллизия реализована с применением паттерна ObjectPool, хотя мне нравится перевод бассейн объектов. Для большей части объектов необходим коллайдер примитивной формы, мы заранее спавним тысячи GameObject’ов с разным типом компонентов коллизии.

Когда инстанс объекта попадает в рендер, то мы берем из басейна свободный коллайдер и располагаем его в нужной позиции и с нужным размером. В случае если свободного объекта нету, то создаем новый, но это неприятный сценарий, поэтому количество объектов в басейне на этапе инициализации желательно угадать как можно точнее.

Когда объект пропадает из зоны видимости мы сбрасываем его параметры и отключаем. Таким образом мы практически лишаемся необходимости лишний раз вызывать Instantiate и Destroy методы, которые как многие знают выделяют много памяти и работают медленно.

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


Video oldindan ko‘rish uchun mavjud emas
Telegram'da ko‘rish
Пригодился GPU Instancing для рендера десятков тысяч схожих объектов в одном кадре. GPU Instancing позволяет отправлять параметры напрямую видеокарте и не использует компоненты Unity.

Скрипт создаёт матрицу позиции и поворота объектов, а Graphics.DrawMeshInstanced принимая мэш и материал рисует объекты. Максимальный предел 1023 объекта за один вызов.

На моей сцене стабильный FPS начинает падать примерно после 70 000 объектов. На других сценах при меньшем количестве освещения и постэффектов можно спокойно рисовать до миллиона объектов.

Сейчас разбираюсь почему наличие Point Light в кадре умножает количество прорисовок примерно в 5 раз даже при отсутсвии вблизи объектов, которые попадают в GPU Instacing.

Ссылка на скрипт, который делает магию.


ResizableRectangleShaderGraph.png
404.3Kb
Граф, можно настраивать размер и цвет границ. Прямоугольник рисуется процедурно, поэтому текстура не нужна.


Небольшой, но полезный шейдер, который я собрал в Shader Graph. Позволяет отрисовать прямоугольник с одинаковым размером границ независимо от размера.

Ниже скину граф, если захотите себе в проект такой же.

19 ta oxirgi post ko‘rsatilgan.