Войти
UnityФорумПрограммирование

[Решено] Navmesh или колхоз?

#0
(Правка: 17 сен. 2020, 3:20) 19:39, 16 сен. 2020

Пытаюсь соорудить простейшее поведение толпы мобов.

Можно конечно запилить свой поиск пути и все такое, но не в этот раз. Делаю все по фэншую - по максимуму использовать возможности движка.

Итак, тестовая сцена
1. Плоскость
2. Куб - препятствие (NavMeshObstacle с дефолтными настройками)
3. скрипт генерит пару десятков капсул - агентов (NavMeshAgent с дефолтными настройками)
4. клик мышки рэйкастит из камеры в курсор на плоскость и выставляет destination всем агентам именно туда

+ Показать

Ожидания:
1. все агенты выстраиваются колечком вокруг куба
2. агенты обходят друг друга, не толкая друг друга -  уважая выставленные агентам радиусы

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

+ Показать

Вопросы:
1. поставить где-то галочку и все станет чики-пуки?
2. как-то по особому тюнить штатную систему?
3. писать костыли в обход штатной системы?

В общем, буду рад любым подсказкам.

ИТОГ: https://gamedev.ru/unity/forum/?id=255120&m=5253362#m5

#1
(Правка: 20:45) 20:40, 16 сен. 2020

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

Я вижу два решения для конкретной ситуации, и это не костыли, а дополнительное поведение:
1. Посчитать количество агентов, идущих к точке, и задать им разные конечные точки по кольцу вокруг объекта (если нужно именно чтобы они окружали, как люди окружают кого-то, чтобы не дать ему уйти)
2. Если два агента сталкиваются (можно проверить по расстоянию и уменьшению скорости), более дальний пусть отбежит вбок на небольшое расстояние и попробует снова идти к своей точке.

#2
(Правка: 20:51) 20:46, 16 сен. 2020

LifeKILLED
> По понятным причинам, они сами не являются препятствиями на навмеше, поэтому не видят друг друга. И идут к ближайшей границе навмеша на пути к точке назначения.
я тоже так думал, но доки говорят что это не так
https://docs.unity3d.com/Manual/nav-NavigationSystem.html

NavMesh Agent component help you to create characters which avoid each other while moving towards their goal. Agents reason about the game world using the NavMesh and they know how to avoid each other as well as moving obstacles.

где-то в другом месте собака зарыта.

LifeKILLED
> Я вижу два решения для конкретной ситуации, и это не костыли, а дополнительное
> поведение:
> 1. Посчитать количество агентов, идущих к точке, и задать им разные конечные
> точки по кольцу вокруг объекта (если нужно именно чтобы они окружали, как люди
> окружают кого-то, чтобы не дать ему уйти)
> 2. Если два агента сталкиваются (можно проверить по расстоянию и уменьшению
> скорости), более дальний пусть отбежит вбок на небольшое расстояние и попробует
> снова идти к своей точке.
а пробовал? на каком кол-ве объектов, какой жанр игры?

#3
(Правка: 23:08) 21:15, 16 сен. 2020

поток мыслей

+ Показать

#4
(Правка: 23:07) 21:36, 16 сен. 2020

поток мыслей с картинками

+ Показать

(кто не видел - в юньке прикольные Gizmo для navagent)
#5
(Правка: 23:05) 23:03, 16 сен. 2020

Победа!

+ Показать

Короче, надо было постичь смысл галочки Carve у NavMeshObstacle.

Без этой галочки препятствие считается подвижным и агент будет стараться его "обрулить", т.е. либо ждать пока проедет, либо замедляться чтобы увернуться, либо чуть-чуть поменять траекторию.
А с галочкой - препятствие считается стационарным и агент строит обходной путь.

https://docs.unity3d.com/Manual/nav-InnerWorkings.html
https://docs.unity3d.com/Manual/class-NavMeshObstacle.html

Итого, чтобы сделать нормально навигирующуюся толпу мобов, надо:
1. повесить на мобов Obstacle, который активен когда моб стоит. Ставим Carve=true
2. повесить на мобов Agent, который активен когда моб двигается

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

#6
2:51, 17 сен. 2020

скромное мнение: в случае юнити "по фэн-шую" – это использовать возможности движка по минимуму. ни за что не агитирую, просто рекомендую с осторожностью полагаться на решения, которые у них "как бы фирменные".

#7
3:26, 17 сен. 2020

dirmenbitz
Спасибо за рекомендацию, но я ничего не понял)

1. О каких фирменных решениях идет речь? О том, что включено в базовый комплект? Или только о пакетах, которые можно доустановить, вроде hdrp и dots?
2. О каких мерах предосторожности речь?
3. По сравнению с чем опасны эти решения?

#8
4:21, 17 сен. 2020

1. я не вижу принципиальной разницы между "базой/доустановить"
2. о построении кор-логики на основе апи, отдаваемых движком. вот мы в соседней теме про JVM обсуждали ограничения, которые должны пойти на пользу архитектуре. технически ограничения пользы может и не пренесут, но сама идея, "поменьше зависеть от движка" – она здравая.
3. по сравнению с не "вендор-локнутыми" решениями.

я поясню свою мысль, но сначала проиллюстрирую идею: очень кстати на хабре сегодня читал перевод.
В культуре юнити очень чувствуется похожий подход: тащить все что ни попадя в движок, бросать в полудоделанном состоянии и тащить что-то новое. так они UI 4 раза полностью переделывали, и каждый новый-то уж был как бы "по-фэншую" (ни один так до ума и не довели, хотя обатная совместимость вроде есть), и похожих историй с их "рекомендованными решениями" хватает.

я вижу примерно 3 негативных аспекта:
– вендор-лок на юнити. это может оказаться неприятно (среди прочего, если эту логику захочется гонять и на сервере – дополнительные ограничения)
– если что-то пошло не так, то не выйдет кастомизировать (по крайней мере, все то, что поставляется не в виде исходников). а пойти не так – оно может: может шаг в сторону от того, как задумали авторы работать не будет, может просто баг. и чинить они его вполне вероятно не станут.
– даже если сейчас все работает, то сломать могут позже. и если куча логики написана поверх – может оказаться мучительно больно.

но повторюсь: это не значит, что не надо использовать навмеш. просто надо иметь в виду.

#9
(Правка: 10:04) 10:03, 17 сен. 2020

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

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

#10
(Правка: 12:52) 12:50, 17 сен. 2020

dirmenbitz
форкнул тему, предлагаю с обсуждением фэншуя в юнити перебраться туда.

Salamandr
О, спасибо! На досуге разберу. Может в этой игре и не понадобится, но разобраться в этом точно надо будет.

UnityФорумПрограммирование