(Unity) Правильная реализация столкновения NavMeshAgent
Есть лист NavMeshAgent'ов, которые по клику идут к одной точке. Настройки agent стандартные. Когда вместе пытаются попасть в одно и тоже место, они начинают толкать друг друга, чтобы пробраться в точку. Можно ли как-то избежать столкновений, и сделать так(примерно), чтобы при занятой точке они приближались к ближайшей или останавливались при столкновении? Вот код на движение(самый стандартный):
foreach (NavMeshAgent agent in navAgents)
agent.destination = targetPosition;
Вот пример кода из ответа(правильный?)
foreach (NavMeshAgent agent in navAgents)
{
Vector3 MathPosition = new Vector3(targetPosition.x + Random.Range(-2, 2), targetPosition.y + Random.Range(-2, 2), targetPosition.z);
agent.destination = MathPosition;
}
Ответы (1 шт):
Для твоего случая, то есть движения группы:
Тебе нужно взять targetPosition и рассчитать смещение относительно этой точки для всей группы, То есть каждый NavMeshAgent получит назначение не в targetPosition, а targetPosition.x + x и targetPosition.y+y (смотри картинку).
Этим же способом можно реализовать разные построения (квадрат, круг, шеренга и тд)

Update для комментариев
Random не подходит нужно самостоятельно рассчитать расстояние между юнитами. Нужно учесть радиус агента и желаемое расстояние между ними, исходя из этого и количества юнитов в группе пишешь алгоритм построения (квадрат, круг, шеренга и тд).
PS: Алгоритм не будет простым и придется над ним поработать
Ну и допустим код из комментария кое как подходит(как пример)
Но нужно рассчитать еще и изначальное смещение и шаг:
Например(для квадрата) есть:
AgentCounts = 100;
AgentRadius = 5;
AgentGap = 5;
destenation = Vector3(...);
Тогда:
startX = destenation.x - (sqrt(AgentCounts)/2)*(AgentRadius + AgentGap);
startY = destenation.y - (sqrt(AgentCounts)/2)*(AgentRadius + AgentGap);
for(row = 0; row < sqrt(AgentCounts); ++row){
for(col = 0; col < sqrt(AgentCounts); ++col )
{
Vector3 MathPosition = new Vector3(startX , startY , targetPosition.z);
agent.destination = MathPosition;
startY += AgentRadius + AgentGap
}
startX += AgentRadius + AgentGap
startY = destenation.y - (sqrt(AgentCounts)/2)*(AgentRadius + AgentGap);
}
PS2: это псевдокод для демонстрации с чего начать и вряд ли будет работать.