Продолжаю играться в Unity3d.
В этой заметке постараюсь рассказать как при помощи грязного костыля можно обойти статичность компонента NavMesh.

Для обработки перемещения персонажей и игрока, в том числе, движок предлагает универсальный и довольно мощный инструмент — NavMesh. Фактически, это двумерная фигура — сетка, которая натягивается на террейн и позволяет обрабатывать перемещения агента NavMeshAgent.

image

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

image

Проблема заключается в том, что NavMesh на модель корабля в лоб натянуть мы не можем. Модель — динамическая, меш — статичен.

Я нашел следующий выход:
— отключаем коллайдер корабля (компонент, отвечающий за физику модели)
— создаем несколько боксов, имитирующих палубу
— генерируем NavMesh для этих боксов
— отключаем компоненты, отвечающие за рендер боксов, т.е. делаем их невидимыми

Вуаля — капитан лихо шлепает по NavMesh'у, натянутому на невидимые боксы. При небольших градусах раскачки корабля не сильно заметно, что он немного «проваливается» под палубу.

Область применения костыля достаточно широкая. Можно, например строить Mesh для птиц/драконов, имитировать левитацию, строить невидимые мосты и.т.д.

Есть, конечно, дополнительные инструменты — NavMeshObstacles, т.е. динамические препятствия, но и с ними проблем хватает.

Если у кого-то есть идеи, как сделать лучше, пожалуйста, поделитесь опытом.
Поделиться с друзьями
-->

Комментарии (13)


  1. Ichimitsu
    22.06.2016 09:55

    NavMeshObstacles, апроксимированный кубами, по тому же принципу что вы описали, для построения сетки пути, работает ровно также. Делали большой проект, пользовались только им для описания статичных не перемещающихся NPC. Все работает отлично в поиске пути. Проблем не замечено. Можете описать, что за проблемы у вас были с NavMeshObstacles


  1. vbs
    22.06.2016 10:33
    -1

    Наверное некорректно публиковать ссылки на сторонние ресурсы, показал бы на видео. Поэтому постараюсь объяснить как сумею.
    Препятствия я использую в первую очередь как двери.

    Столкнулся с неприятностью. Предположим, за дверью скопилось несколько злобных мобов, которые очень заинтересованы в игроке как деликатесе. Все они напирают на дверь — препятствие. Задние подталкивают передних (я имею ввиду CharacterController'ы персонажей). В результате по неведомой причине, в определенный момент времени несколько передних мобов «просачиваются» сквозь непрозрачный для них NavMeshObstaсle.
    Поэтому и выдумываю костыли, пример с кораблем только один из.


    1. Ichimitsu
      22.06.2016 14:42

      Ну так описанная ситуация не к NavMesh имеет отношения, а к физике это раз и к поведению персонажей это два.
      Если в первом случае, надо настраивать правильно физические представления, ибо чем меньше значения оных, тем менее точно физика работает. Если у вас коллидеры по 0.1f размером, это не тоже самое, что при 10f. Будут артекфакты, их можно убрать через способ определения колизии, поменять дискретный, на непрерывный.
      А в лучшем случае, персонажи не должны давить друг на друга.


      1. vbs
        22.06.2016 21:47

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


    1. Leopotam
      22.06.2016 19:34

      CharacterController

      Как этот хак физики относится к NavMeshAgent (с avoidance), который и должен был быть использован?


      1. vbs
        22.06.2016 21:50

        Напишите подробнее, интересно. А лучше небольшую статью. Нашел пару ресурсов на английском, поизучаю как руки дойдут.


        1. vbs
          22.06.2016 22:05

          Напишите подробнее про avoidance, интересно. А лучше небольшую статью. Нашел пару ресурсов на английском, поизучаю как руки дойдут.
          По поводу что куда кого подталкивает однозначно сказать не могу, только предполагатю. Моб сложный — CharacterController + NavMeshAgent + BoxCollider/trigger (включает/отключает скрипт ИИ). Не исключаю, что и скрипт может подбагивать.
          Кхм, странно. Попытался отредактировать комментарий, ресурс пишет, что время истекло. Через какое-то время само заработало.


          1. Leopotam
            22.06.2016 22:36

            CharacterController — внутри оно реализовано как колайдер с включением-выключением rigidbody в FixedUpdate, те постоянные дергания физики с учетом движения игрока как капсулы + скольжения вдоль стен. Но это бессмысленно, потому что навмеш-агент игнорирует все, кроме других навмеш-агентов и в принципе не может выйти за пределы запеченного навмеша. При использовании физики наступает конфликт, ведущий к проталкиванию сквозь препятствие и ошибкам. По поводу авоиданса — у каждого навмеш-агента есть «качество» просчета авоиданса с указанием приоритета. Достаточно просто его включить и выставить одинаковый приоритет — каждый навмеш будет отталкивать всех прочих.


  1. HexGrimm
    23.06.2016 22:37

    Что это за бред? У вас при такой реализации невидимая часть остаётся помеченной статичным флагом? Тогда ваше решение работает только если корабль не плывёт, правильно я понимаю?


    1. Ichimitsu
      24.06.2016 07:36

      В статье о том и речь, что если объект не перемещается но при этом анимирован, то вот можно его не NavMeshObstacles помечать, а апроксимировать кубами и запечь в карту NavMesh.


    1. vbs
      24.06.2016 10:12

      Это называется недочитал, недопонял, но неодобряю.
      Бред, на мой непрофессиональный взгляд, это городить вавилонскую башню в качестве Sound Manager.
      Уважаемый, начинать комментарий с указанного выше предложения — это банальный выпендреж. Пора выходить из подросткового возраста, вы же Ведущий Разработчик).


      1. Ichimitsu
        24.06.2016 11:15
        -1

        Ну что-ж вы так реагируете) Будьте терпимы. Sound Manager это не Вавилонская башня, это реальная вещь, к которой так или иначе придешь, если начнешь делать более или менее серьезные проекты. В 4 юнити без нее вообще никуда, в 5 стало попроще из-за наличия Mixer.


      1. HexGrimm
        27.06.2016 11:17

        Мне грустно что хаб Unity3d превращяется в gamedev/ru…