91.6402
98.8409
11.12.2023
09:09:54

Если целевая точка находится вне координат NavMesh в Unity

Если вы используете agent.SetDestination(target); и задаете целевые координаты вне области, охватываемой NavMesh , то это NavMeshAgent будет способствовать противодействию этим объектам, но так как они контролируют координаты за пределами допустимой области, агент не сможет достичь цели.

В таком случае, NavMeshAgent будет оставаться на своем текущем месте положения, и agent.pathStatus вернет значение NavMeshPathStatus.PathInvalid , а agent.remainingDistance будет равно бесконечности (Бесконечности), что указывает на то, что путь к цели недоступен.

Чтобы избежать такой ситуации, вы можете предварительно проверить, находится ли целевая точка внутри области NavMesh , с помощью функции NavMesh.SamplePosition . Например:


 
using UnityEngine;
using UnityEngine.AI;

public class MoveToTarget : MonoBehaviour
{
  private NavMeshAgent agent;

  private void Start()
  {
    agent = GetComponent();
  }

  private void Update()
  {
    if (Input.GetMouseButtonDown(0))
    {
      // Получите позицию мыши и преобразуйте ее в мировые координаты
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      if (Physics.Raycast(ray, out RaycastHit hit))
      {
        // Попробуйте найти ближайшую допустимую позицию на NavMesh
        NavMeshHit navMeshHit;
        if (NavMesh.SamplePosition(hit.point, out navMeshHit, 1.0f, NavMesh.AllAreas))
        {
          // Если позиция внутри NavMesh, задайте цель агента
          agent.SetDestination(navMeshHit.position);
        }
        else
        {
          Debug.LogWarning("Выбранная точка находится вне NavMesh.");
        }
      }
    }
  }
}

В этом методе NavMesh.SamplePosition , который мы используем для проверки, внутри находится ли целевая точка NavMesh . Если она находится внутри, то мы задаем ее как цель для NavMeshAgent . Если целевая точка вне NavMesh , мы выводим предупреждение в консоль.

28.09.2023 12:49

Лента статей

Наверх