Объявление
public Experimental.AI.PathQueryStatus Raycast(out AI.NavMeshHit hit, Experimental.AI.NavMeshLocation start, Vector3 targetPosition, int areaMask, NativeArrayПараметры
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Параметры
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();
}
}