Страница 1 из 1

Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 12:44
TonyMax
По нажатию правой кнопки мыши, если щелчок произошел по terrain - ставится префаб флага и всем выделенным юнитам производится команда agent.SetDestination(targetPosition);
Если я правильно понял, то даже по достижению targetPosition объект все равно считает эти координаты своей целью, пока ему не будут переданы другие, неистово стараясь добраться до цели. Для этого предусмотрены команды agent.Stop() и agent.Resume()
Так вот в update() я проверяю
Синтаксис:
Используется csharp
if (agent.remainingDistance <= agent.stoppingDistance && agent.remainingDistance !=0) {
            Debug.Log(agent.remainingDistance);
            agent.Stop();
            body.velocity = Vector3.zero;
        }

если расстояние до цели меньше или равно расстоянию остановки (объект добрался до цели) - то остановить его. Также я попробовал прописать body.velocity = Vector3.zero; в попытках полностью прекратить движение объекта.
Собственно проблема в том, что при всем этом юниты все равно, пусть немного, но меняют свое положение по осям X,Z.
Может, кто-то сталкивался с этой проблемой, или просто скажет мне в чем я дурак.

P.S. физический материал с вменяемым трением прописывать пробовал - вообще ничего не меняется.
P.S.S а еще иногда объекты в попытках пройти к цели начинают с огромной скоростью летать по карте, и я совсем не понимаю в чем триггер этого бага

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 16:26
Splurgeola
не уверен, но
SetDestination(Vector3.zero)
проверь.
ну или targetPosition = vector3.zero

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 16:59
TonyMax
не уверен, но
SetDestination(Vector3.zero)
проверь.
ну или targetPosition = vector3.zero


Vecor3.zero возвращает Vector3(0,0,0). Юнит пойдет в точку 0.0.0 на карте. (я даже на всякий случай проверил, ибо несложно это).

Кстати, если писать stop(), когда объект достигает необходимого расстояния до точки, и писать resume(), когда назначается новая позиция, то иногда, судя по поведению юнита, stop() срабатывает сразу после добавления новой цели. Даже если ввести bool переменную отвечающую за то двигается ли объект или нет а затем изменить условие на
Синтаксис:
Используется csharp
if (agent.remainingDistance <= agent.stoppingDistance && IsMoving) {

то stop все равно срабатывает сразу после нового targetPosition, видимо потому что agent.remainingDistance не успевает посчитаться.

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 17:02
Cr0c
https://docs.unity3d.com/ScriptReferenc ... tance.html
Должен сам останавливать агента. Может этот параметр слишком мал?

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 17:11
TonyMax
https://docs.unity3d.com/ScriptReferenc ... tance.html
Должен сам останавливать агента. Может этот параметр слишком мал?

Агент действительно останавливается, но зачастую дергается на месте и скользит в произвольную сторону.
Я попробовал откинуть его от цели в момент работы и он начал опять к ней двигаться, то есть действие setDestination(Vector3) не заканчивается

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 18:05
Cr0c
Отключать компонент агента при достижении точки.

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 26 июн 2016, 19:45
TonyMax
Отключать компонент агента при достижении точки.


Благодарю за идею.

Сходил проверил, как будет работать. Итоги:
- Объект отключает агента, останавливается и начинает вменяемо реагировать на физику, что просто отлично
- Объект падает и подпрыгивает, что, скорее всего, вызвано некоторым расстоянием между его BoxCollider и коллайдером от агента, который заставляет объект как бы немного парить над землей (что видимо и объясняет "скольжение"). Иногда объект вообще проваливается под Terrain.
- Другие агенты, будучи в движении полностью игнорируют объект с выключенным NavMeshAgent.

Возможные решения:
- Чтобы "подпрыгивание" было наименее заметным можно подогнать размер BoxCollider под размер итогового коллайдера агента. Но это смахивает на жирный костыль. К тому же он не решает проблему проваливания под Terrain.
- Чтобы объект не проваливался под Terrain, если я не ошибаюсь, можно включить усиленный просчет столкновений (забыл как называется), если таковой имеется вообще.
- Чтобы другие объекты не игнорировали нашего не действующего агента, можно так же включать и выключать ему NavMeshObstacle, если, конечно, оно будет так работать.

Вопрос: все ли я правильно понимаю и есть ли какие-нибудь более элегантные варианты решения возникших проблем?

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 27 июн 2016, 02:00
TonyMax
После некоторого времени биения руками по клавиатуре и смотрения на результат выяснилось, что для NavMeshAgent не стоит включать RigidBody (либо включать с использованием isKinematic). Совместная работа агента и просчета действующих физических сил на объект приводит к тому, что он начинает контролироваться сразу несколькими компонентами.

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 27 июн 2016, 02:32
SuKioto
в документации это все написано же.
http://docs.unity3d.com/Manual/nav-Mixi ... nents.html

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 28 июн 2016, 12:47
TonyMax
в документации это все написано же.
http://docs.unity3d.com/Manual/nav-Mixi ... nents.html


плохо смотрю документацию

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 15 май 2022, 09:03
puermannias
Вопрос, можно ли как то прервать дивжения врага когда он еще идет, то есть на середине пути и остановить на некторое время, и после этого он пойдет дальше ?

Re: Nav Mesh Agent - скольжение агентов

СообщениеДобавлено: 15 май 2022, 10:06
1max1
В гугл вбиваешь "navmeshagent stop" и радуешься по первой ссылке.