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

NavMesh не работает как надо

#0
9:06, 21 сен. 2017

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

1 | NavMesh не работает как надо

У босса есть
- коллайдер, чтобы фиксировать, когда игрок в него стреляет
- NavMeshAgent для перемещения в сторону игрока
- триггер внизу, при соприкосновении с которым игрок будет считаться убитым

Как сделать, чтобы босс не наклонялся, находясь близко к игроку?

2 | NavMesh не работает как надо

#1
11:59, 21 сен. 2017

по описанию сложно понять суть проблемы
но как вариант :
1. использовать на игроке компонент Nav Mesh Obstacle
2. не использовать NavMesh Agent для непосредственного движения а только для расчетов пути

#2
13:43, 21 сен. 2017

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

Еще не видна структура самого объекта босса. Может быть у тебя риг анимация, а босс натянут не верно на кости из-за этого такие казусы вполне возможны

#3
14:11, 21 сен. 2017

Кажется понял, в чем дело. Я Stopping Distance в скрипте и компоненте NavMeshAgent устанавливал в 5, а нужно было сделать 0. Потому что когда было 5, босс не мог подойти к игроку, но скрипт его все-равно к нему толкал. Вот скрипт, если что

    public Transform target;
    private NavMeshAgent agent;

    public int attackDistance;
    public bool shouldStop;

    void Start ()
    {
        agent = GetComponent<NavMeshAgent>();
  }
  
  void Update ()
    {
        if (!shouldStop)
        {
            agent.SetDestination(target.position);

            //agent.destination = new Vector3(1, 2, 3);
            //agent.Resume();

            agent.destination = target.position;
            if (agent.remainingDistance >= attackDistance) // если агент еще не подошел к цели достаточно близко
                agent.Resume();
            else
                transform.LookAt(target); // поворачиваем объект к цели
        }
    }

В общем, теперь заработало, всем спасибо)

#4
14:37, 21 сен. 2017

Новость для меня =) буду знать что нав меш сходит с ума если таскать объект скриптом поперек его мнения. Хотя такие казусы бывали с аниматором, когда управление движением отдавали ему, одновременно с агентом

#5
5:44, 23 сен. 2017

добавь тег в название

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

Тема в архиве.