Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты
Экспериментальный: этот API является экспериментальным и может быть изменен или удален в будущем.

Объявление

public Experimental.AI.PathQueryStatus Raycast(out AI.NavMeshHit hit, Experimental.AI.NavMeshLocation start, Vector3 targetPosition, int areaMask, NativeArray costs);

Параметры

hit Содержит свойства результирующего местоположения raycast.
start Начальное местоположение луча в NavMesh. start.polygon должен иметь тип NavMeshPolyTypes.Ground.
targetPosition Желаемый конец луча в мировых координатах.
areaMask Битовая маска, которая сопоставляет позиции индекса с типами областей. Индекс изменяется от 0 до 31. В каждой соответствующей позиции индекса вы должны установить значение либо 1, либо 0. 1 указывает типы областей, через которые может проходить луч. 0 указывает типы областей, которые блокируют луч. Этот параметр является необязательным. Если вы пропустите этот параметр, по умолчанию он будет NavMesh.AllAreas. Чтобы узнать больше, см.: Области и затраты.
costs Массив пользовательских значений стоимости для всех 32 возможных типов площадей. Они действуют как множители расстояния, сообщаемого лучом при пересечении различных областей. Этот параметр является необязательным. Если вы опустите его, по умолчанию будет использоваться стоимость площади, которую вы настроили в настройках проекта. Дополнительные сведения см. в разделе NavMesh.GetAreaCost.

Возвращает

PathQueryStatusSuccess, если луч можно правильно отследить с использованием предоставленных аргументов.
Failure, если местоположение start недопустимо в NavMeshWorld запроса или находится внутри области, не разрешенной areaMask аргумент или когда он находится на NavMeshLink/OffMeshLink.

Описание

Trace a line between two points on the NavMesh.

Этот метод похож на NavMesh.Raycast, оба они используют одну и ту же базовую реализацию. Свойства, которые отличают его от других:

  • его можно использовать в параллельных заданиях;
  • возвращает флаги состояния, указывающие на успешность или неудачу операции;
  • на сообщаемое hit.distance влияет стоимость площади;
  • результирующий hit.position не корректируется по вертикальной оси в соответствии с сеткой высоты, если он существует;
  • у него есть вариант, описанный ниже, который также возвращает список полигонов, через которые проходит луч.

Возвращенный hit.distance представляет собой прямую линию между начальной и конечной точками. Также учитывается перечень предоставляемых площадей затрат. Это результат суммирования всех расстояний, пройденных лучом по каждой отдельной области, умноженных на стоимость соответствующей области.

Во-первых, проверяется правильность начального местоположения в NavMeshWorld, а целевая точка отображается в NavMesh. Затем трассируется луч от начальной точки к цели. Если вычисление выполнено успешно, данные hit заполняются информацией о самой дальней точке, которой достиг луч. Это происходит независимо от того, был ли заблокирован путь от источника к цели.
Если вычисление завершается ошибкой, возвращенное hit заполняется недопустимыми данными. В частности, поле hit.distance получает значение positiveInfinity.

Если raycast заканчивается на внешнем крае, hit.mask равен 0; в противном случае он содержит маску области блокирующего полигона.

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

NavMeshQuery.Raycast отличается от raycast Physics. NavMeshQuery.Raycast может обнаруживать все виды навигационных препятствий, например дыры в земле. Он также может подниматься по склонам, если местность судоходна.

// TargetReachable using Unity.Collections; using UnityEngine; using UnityEngine.AI; using UnityEngine.Experimental.AI; public class TargetReachable : MonoBehaviour { public Transform target; NavMeshQuery m_NavQuery; NavMeshHit m_Hit; void OnEnable() { m_NavQuery = new NavMeshQuery(NavMeshWorld.GetDefaultWorld(), Allocator.Persistent); } void Update() { var startLocation = m_NavQuery.MapLocation(transform.position, Vector3.one, 0); var status = m_NavQuery.Raycast(out m_Hit, startLocation, target.position, NavMesh.AllAreas, new NativeArray()); if ((status & PathQueryStatus.Success) != 0) { Debug.DrawLine(transform.position, target.position, m_Hit.hit ? Color.red : Color.green); if (m_Hit.hit) Debug.DrawRay(m_Hit.position, Vector3.up, Color.red); } } void OnDisable() { m_NavQuery.Dispose(); } }

Объявление

public Experimental.AI.PathQueryStatus Raycast(out AI.NavMeshHit hit, NativeSlice path, out int pathCount, Experimental.AI.NavMeshLocation start, Vector3 targetPosition, int areaMask, NativeArray costs);

Параметры

hit Содержит свойства результирующего местоположения raycast.
path Буфер, который будет заполнен последовательностью полигонов, через которые проходит луч.
pathCount Сообщаемое количество полигонов, через которые прошел луч, все хранится в буфере path. Оно не должно превышать path.Length..
start Начальное местоположение луча в NavMesh. start.polygon должен иметь тип NavMeshPolyTypes.Ground.
targetPosition Желаемый конец луча в мировых координатах.
areaMask Битовое поле, указывающее, какие области NavMesh можно пройти при трассировке луча. Этот параметр является необязательным. Если вы не заполните этот параметр, по умолчанию он будет NavMesh.AllAreas.
costs Множители стоимости, влияющие на расстояние, сообщаемое лучом по различным типам областей. Этот параметр является необязательным. Если вы опустите его, по умолчанию будет использоваться стоимость площади, которую вы настроили в настройках проекта.

Возвращает

PathQueryStatus Success, если луч можно правильно отследить с использованием предоставленных аргументов.
Failure, если местоположение start недопустимо в NavMeshWorld запроса или находится внутри области, не разрешенной areaMask аргумент или когда он находится на NavMeshLink/OffMeshLink.
BufferTooSmall является частью возвращаемых флагов, когда предоставленный буфер path недостаточно велик для хранения всех полигонов, через которые прошел луч.

Описание

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

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

Смотрите так же: PolygonId.

// StraightPathFromRay using Unity.Collections; using UnityEngine; using UnityEngine.AI; using UnityEngine.Experimental.AI; public class StraightPathFromRay : MonoBehaviour { public Transform target; NavMeshQuery m_NavQuery; NavMeshHit m_Hit; NativeArray<PolygonId> m_Path; int m_PathCount; void OnEnable() { m_Path = new NativeArray<PolygonId>(3, Allocator.Persistent); m_NavQuery = new NavMeshQuery(NavMeshWorld.GetDefaultWorld(), Allocator.Persistent); } void Update() { var startLocation = m_NavQuery.MapLocation(transform.position, Vector3.one, 0); PathQueryStatus status = m_NavQuery.Raycast(out m_Hit, m_Path, out m_PathCount, startLocation, target.position, NavMesh.AllAreas, new NativeArray()); if ((status & PathQueryStatus.Success) != 0) { var bufferTooSmall = (status & PathQueryStatus.BufferTooSmall) != 0; Debug.DrawLine(transform.position, m_Hit.position, bufferTooSmall ? Color.black : Color.green); if (m_Hit.hit) Debug.DrawRay(m_Hit.position, Vector3.up, Color.red); } } void OnDisable() { m_NavQuery.Dispose(); m_Path.Dispose(); } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3