GameDev HACK
91 subscribers
29 photos
14 videos
6 files
100 links
HACK — Helpful Advice, Code & Knowledge

Blog by a developer sharing advice and coding tips to help you create better games.


Уютный бложик в виде записок разработчика @AnikoV. Полезные советы, код и знания.
Download Telegram
🧠Как создать динамическую навигационную сетку для игр?

Разработчик Томаш Чайенски поделился опытом реализации динамической триангуляции с ограничениями (Constrained Delaunay Triangulation, CDT) для игр с изменяемыми картами.

Он модифицировал алгоритм Слоуна, добавив методы addPoint() и removePoint() — это позволило эффективно обновлять навигационную сетку по мере изменений окружения, не перестраивая её полностью. Ключевые элементы — это структура half-edge, ускоренный поиск треугольников через jump-walk и язык Zig вместо JavaScript: производительность выросла с 300 секунд до 25 мс при 12 000 точек.

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

📌Источник - блог Томаша Чаенски
#gamedev #unity #gameai #navigation #ai
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
На GDC 2022 Ben Sunshine-Hill (Havok Navigation) выступил с интересным докладом «Down with Nav Meshes» и предложил способы использования coridor maps для навигации.

🔥Мотивация:
- navmesh не так хорошо работает с динамическим окружением
- navmesh не масштабируется под разных NPC
- navmesh требует кучу ручной поддержки

🆕Что вместо?
- Corridor Maps — не поверхности, а графы переходов между областями

- Определяет границу на любой точки поверхности с помощью Срединной оси

- Разделяет всю площадь навигации на монотонные выпуклые формы на основе того какая граница является ближайшей к точке на поверхности

- Если сложить все оружности с центрами на границах полученных форм, то мы получим полную навигационную поверхность (то есть это альтернативный способ описать навигационную поверхность)

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

❌ Минусы
- сложнее генерация
- перестройка всей AI-архитектуры
- не содержит данных о зонах
- плохо работает с многоуровневыми средами - приходится генерировать для каждого уровня отдельно и мёржить результаты

✅ Плюсы
- повсеместное использование дополнительной информации о дистанции до границ (спавн, построение путей, геймплейные механики, steering, avoiding, запросы о видимости)

- универсальные навигационные данные — одна система для всех размеров NPC

📌Ссылки:
https://webspace.science.uu.nl/~gerae101/pdf/corridor.pdf
https://webspace.science.uu.nl/~gerae101/UU_crowd_simulation_publications_ecm.html
https://github.com/alexshafranov/corridormap

#gamedev #gameai #AI #pathfinding #Havok #gdc2022 #gdc #programming
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤2
Мне кажется это один из самых оптимальных на сегодняшний день подходов для дизайна архитектуры проектов. Не важно какой DI, не важно какой ECS. Их смесь и правильное разделение модулей и их зависимостей asmdef-ами даёт очень многое.
Forwarded from Everyday Unity
How to Use Dependency Injection with ECS

A new post on my blog.
I’ve seen this question come up quite often in ECS discussions, so I decided to share how I typically integrate Dependency Injection with ECS — complete with the simplest working example on GitHub. To me, such a setup always feels more convenient and more efficient. But it doesn't mean it is the only or the right way to work with it. If you prefer the Entities approach, or a manual setup of dependencies via the inspector in Morpeh, then that is also okay.

https://gamedev.center/how-to-use-dependency-injection-with-ecs-for-scalable-game-development/

Repo: https://github.com/AlexMerzlikin/ECS-DI-Sample

#ecs #di
👍2🔥1
Набор рекомендаций для сражения с долгим Domain Reload в Unity. Всё ради быстрых итераций. Всё как обычно - померять, распознать бутылочные горлышки, пофиксить.

https://johnaustin.io/articles/2020/domain-reloads-in-unity
👍3❤2🔥1
Оскар Стольберг рассказывает о тонкостях генерации островов с помощью коллапса волновой функции или редукции фон Неймана (алгоритмом, вдохновлённым идеями квантовой механики) [habr.com] и не только. Также Оскар автор проекта https://www.townscapergame.com/ , который можно погонять прямо онлайн в браузере без регистрации и смс и пощупать WFC в действии.

Ссылка на доклад https://www.youtube.com/watch?v=NpfoRAzfGDg
❤1
Player Loop

Вместо MonoBehaviour на сцене можно использовать инжект в текущий луп. Для этого нужно понимать в какой именно мы хотим добавить вызов своего метода. Всего есть 8 групп:

TimeUpdate = 0
Initialization = 1
EarlyUpdate = 2
FixedUpdate = 3
PreUpdate = 4
Update = 5
PreLateUpdate = 6
PostLateUpdate = 7


Использовать проще всего с инжектом при инициализации, но в принципе можно вызывать этот код когда угодно, как и удалять свою систему из обработки:


[RuntimeInitializeOnLoadMethod]
static void Inject() {
var loop = PlayerLoop.GetCurrentPlayerLoop();
var sys = new PlayerLoopSystem {
type = typeof(YourClassName),
updateDelegate = () => Debug.Log("Custom Update")
};
var index = 4; // PreUpdate (см список выше)
loop.subSystemList[index].subSystemList = loop.subSystemList[index].subSystemList.Append(sys).ToArray();
PlayerLoop.SetPlayerLoop(loop);
}


#unity #playerloop
2👍2🔥1👏1
Недавно наткнулся на доску в miro с дорожной картой развития Unity-разработчика.

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

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

Понятно, что тут нет многих глубоких вещей, но именно для старта или получения общего обзора - более чем.
🔥2
Мы представляем новую модель контакта, называемую Offset Geometric Contact (OGC), для гарантированного моделирования объектов с минимальными вычислительными затратами без проникновения. Наш метод основан на построении объемной формы путем смещения каждой грани вдоль ее нормального направления, что обеспечивает ортогональные силы контакта и, таким образом, позволяет получить большой радиус контакта без артефактов.

https://graphics.cs.utah.edu/research/projects/ogc/

https://www.youtube.com/watch?v=7NF3CdXkm68
🔥4
Старое видео о том, как игры используют обратную связь с игроком (feedback loops): структуры вознаграждений в играх, которые могут усиливать или балансировать победителей и проигравших.

На примере Pyre от SupergiantGames

https://www.youtube.com/watch?v=H4kbJObhcHw
🔥1
🎮 Ранее я уже упоминал интересный блог Глена Фидлера — основателя NetworkNext и эксперта по мультиплееру
(тот пост — тык).

У него есть легендарная статья о реализации игрового цикла с разной частотой обновления логики и рендера

👉 Fix Your Timestep!

Но сегодня — не о ней 😉
Я наткнулся на отличное продолжение этой темы и хочу поделиться ею с вами:

👉 Upgrade Your Timestep!

она развивает идеи Фидлера и добавляет несколько практичных апгрейдов.

🧠 хранить время в u64 (uint64) (наносекундах), а не в double — потому что при долгой работе float и double теряют точность, и симуляция со временем начинает «плыть»;

🛠 рассмотреть проблему времени в шейдерах, которые используют float, — автор ссылается на решение Джонатана Блоу (автор Braid, The Witness (очень советую, кстати, оба эти проекта - покажите их детям) ) и предлагает своё возможное улучшение;

🐌внедрить timescale, который позволяет ускорять или замедлять течение времени без нарушения детерминизма;

⏱️ добавить таймеры, работающие на этой же временной системе — удобно для событий вроде задержек, подсказок и внутриигровых таймингов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from C# Ready | Unity
Интерсепторы: ловим вызов метода до его выполнения — без сторонних библиотек!

Иногда нужно логировать вызовы, проверять аргументы или внедрять кросс-срезовые фичи в одном месте — вместо разбросанных Console.WriteLine по всему коду.

Подключаем нужные пространства имён и объявляем универсальный интерсептор на основе DispatchProxy:
using System;
using System.Reflection;

public class LoggingInterceptor<T> : DispatchProxy
{
public T Target { get; set; }

protected override object Invoke(MethodInfo method, object[] args)
{
Console.WriteLine($"➡️ Вызов метода: {method.Name}");
return method.Invoke(Target, args);
}
}


Теперь создаём прокси для вашего сервиса и вызываем метод через интерсептор:
// Предположим, есть интерфейс IMyService и класс MyService
IMyService real = new MyService();
var proxy = DispatchProxy.Create<IMyService, LoggingInterceptor<IMyService>>();
((LoggingInterceptor<IMyService>)proxy).Target = real;

// Все вызовы пойдут через интерсептор
proxy.DoWork();


🔥 Получаем логирование каждого вызова без сторонних AOP-библиотек — только .NET Core в комплекте!

➡ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Forwarded from Hipnc Club
А теперь про Gamedev. На сегодняшнем стриме Алексей Калинин покажет, как создавались пропсы для игры Populus Run. Будет много процедурного моделинга, Houdini Engine, Unity3D, а заодно обсудим плюсы и минусы использования Гудини в инди-разработке. Приходите!
Начало, как всегда, в 22:00 по Московскому времени.

https://www.youtube.com/watch?v=MLD7XSjHm8Y
🫡3
Кратко об асинхронных механизмах
https://discussions.unity.com/t/introducing-asynchronous-programming-in-unity/1693772
🔥1
Несколько видео с выдержками из "чистого кода", которые, в том числе, визуально показывают их влияние на общую работу в команде.

Мне кажется, это всё про сокращение "времени координации" при обсуждениях и чтении кода и сокращение размера изменений в PR/MR.

Я не приверженец безукоризненно соблюдать всё, что написано в "чистом коде", но многие вещи оттуда реально работают и проверены временем и работой в разного размера командах. Важно расставлять приоритеты, что важно для каждой команды в данный момент времени и договариваться о общих правилах.
❤1