Что это: Следование за целью. Классический режим преследования.
Как использовать: см. разделы ниже.
AiNavigation — компонент для управления навигацией AI с поддержкой патрулирования, следования за целью и комбинированного режима. Построен на Unity NavMeshAgent с автоматическим управлением анимацией.
Статус: deprecated.
Замена: NpcNavigation.
Важно:
AiNavigationпомечен как устаревший и скрыт из меню добавления компонентов. Для новых проектов используйте модульную системуNpcNavigation(NpcNavigation+ модули).
Требования: NavMeshAgent на том же объекте. Animator опционален.
Следование за целью. Классический режим преследования.
Патрулирование по заданным точкам с остановками и зацикливанием.
Комбинированный режим: патрулирует, но при приближении цели переключается на преследование.
Логика Combined режима:
- Патрулирует по точкам, останавливаясь на
stoppingDistanceот каждой - Каждый кадр проверяет расстояние до
initialTarget(установленного в инспекторе) - При цели ≤
aggroDistance→ АГРО → преследование (onStartFollowing) - При цели >
maxFollowDistance→ ДЕАГРО → останавливается, ждётpatrolWaitTime, продолжает патруль (onStopFollowing) - Продолжает патруль с текущей точки, не сбрасывая прогресс
Важно для Combined:
- Установите
targetв инспекторе (например, Player) aggroDistanceобязательно > 0 (по умолчанию 10м)maxFollowDistance>aggroDistanceили 0 (0 = преследует бесконечно)
movementMode: Режим движения (FollowTarget / Patrol / Combined)
target: Цель для следования (обязательно для Combined режима)triggerDistance: Минимальная дистанция для начала движения (0 = всегда двигается)stoppingDistance: Дистанция остановки (по умолчанию 2м, работает везде)
patrolPoints: Массив точек патруляpatrolZone: BoxCollider для случайного патрулирования (если задан, patrolPoints игнорируется)patrolWaitTime: Время ожидания на точке (по умолчанию 1 сек)loopPatrol: Зацикливание маршрута (по умолчанию true)
aggroDistance: Дистанция начала преследования (по умолчанию 10м)maxFollowDistance: Дистанция прекращения преследования (по умолчанию 20м, 0 = бесконечно)
walkSpeed: Скорость ходьбы (по умолчанию 3 м/с)runSpeed: Скорость бега (по умолчанию 6 м/с)acceleration: Ускорение (по умолчанию 8)turnSpeed: Скорость поворота (по умолчанию 260 град/сек)
autoUpdatePath: Автообновление путиpathUpdateInterval: Интервал обновления (0.5 сек)
animator: Аниматор (опционально)speedParameter: Параметр float для скорости (0-1, по умолчанию "Speed")isMovingParameter: Параметр bool для движения (по умолчанию "IsMoving")
debugMode: Детальное логирование для отладки
bool IsOnNavMesh- На NavMesh ли агентbool HasPath- Есть ли валидный путьbool IsMoving- Двигается лиbool IsRunning- Бежит лиbool IsPatrolling- Патрулирует лиbool UsesPatrolZone- Использует ли зону патрулирования вместо точекbool HasReachedDestination- Достиг целиbool IsPathBlocked- Путь заблокирован
Transform Target- Текущая цельfloat RemainingDistance- Оставшееся расстояниеfloat CurrentSpeed- Текущая скоростьint CurrentPatrolIndex- Индекс текущей точки патруляMovementMode CurrentMode- Текущий режимNavMeshPathStatus PathStatus- Статус пути
float WalkSpeedfloat RunSpeedfloat StoppingDistancefloat Accelerationfloat TurnSpeedfloat TriggerDistancebool AutoUpdatePath
// Управление целью
void SetTarget(Transform newTarget)
bool SetDestination(Vector3 destination)
// Управление движением
void SetRunning(bool enable)
void SetSpeed(float speed)
void Stop()
void Resume()
bool WarpToPosition(Vector3 position)
// Управление патрулем
void StartPatrol()
void StopPatrol()
void SetMovementMode(MovementMode mode)
void SetPatrolPoints(Transform[] points)
void SetPatrolZone(BoxCollider zone)
void ClearPatrolZone()
// Проверки
bool IsPositionReachable(Vector3 position)
NavMeshPath GetPathToPosition(Vector3 position)onDestinationReached<Vector3>- Достигнута цельonPathBlocked<Vector3>- Путь заблокированonSpeedChanged<float>- Изменена скоростьonPathUpdated<Vector3>- Путь обновлёнonPathStatusChanged<NavMeshPathStatus>- Статус пути
onPatrolPointReached<int>- Достигнута точка (индекс)onPatrolStarted- Патруль начатonPatrolCompleted- Патруль завершён
onStartFollowing- Начал преследование (агро)onStopFollowing- Прекратил преследование (деагро)
- 🟡 Жёлтая линия - текущий путь NavMesh
- 🔴 Красная сфера - stoppingDistance
- 🔵 Синяя сфера - triggerDistance (FollowTarget)
- 🟡 Жёлтая сфера - aggroDistance (Combined)
- 🔵 Голубая сфера - maxFollowDistance (Combined)
- 🟢 Зелёные сферы - точки патруля
- 🟢 Зелёные линии - маршрут патруля
- 🟡 Жёлтая сфера - текущая точка
- 🟢 Зелёный полупрозрачный куб - зона патрулирования (patrolZone)
// В инспекторе:
movementMode = FollowTarget
target = Player
ai.SetTarget(player);
ai.SetRunning(true);// В инспекторе:
movementMode = Patrol
patrolPoints = [Point1, Point2, Point3]
patrolWaitTime = 2f
loopPatrol = true
stoppingDistance = 2f
ai.onPatrolPointReached.AddListener(index =>
{
Debug.Log($"Точка {index}");
});// В инспекторе:
movementMode = Patrol
patrolZone = BoxCollider на сцене
patrolWaitTime = 2f
stoppingDistance = 2f
// Агент будет выбирать случайные точки внутри BoxCollider
// и перемещаться к ним бесконечно
// Программное управление:
ai.SetPatrolZone(boxCollider); // Установить зону
ai.ClearPatrolZone(); // Очистить (использовать точки)// В инспекторе:
movementMode = Combined
target = Player // ОБЯЗАТЕЛЬНО!
patrolPoints = [Point1, Point2, Point3]
aggroDistance = 10f
maxFollowDistance = 20f
stoppingDistance = 2f
patrolWaitTime = 1f
ai.onStartFollowing.AddListener(() =>
{
Debug.Log("Заметил!");
ai.SetRunning(true);
});
ai.onStopFollowing.AddListener(() =>
{
Debug.Log("Потерял");
ai.SetRunning(false);
});// Переключить на патруль
ai.SetMovementMode(AiNavigation.MovementMode.Patrol);
// Переключить на преследование
ai.SetMovementMode(AiNavigation.MovementMode.FollowTarget);
ai.SetTarget(player);
// Изменить маршрут
ai.SetPatrolPoints(newRoute);В Animator создайте параметры:
Speed(float) - нормализованная скорость 0-1IsMoving(bool) - двигается ли агент
Компонент автоматически обновит их.
Решение: Установите target в инспекторе перед запуском.
Решение:
- Установите
targetв инспекторе - Проверьте
aggroDistance > 0 - Включите
debugMode
Решение: Проверьте maxFollowDistance > 0 и > aggroDistance
Решение: Проверьте что все точки патруля на NavMesh
Включите debugMode = true для логирования:
[AI NPC] Starting patrol
[AI NPC] Combined: dist=8.5, aggroDistance=10, isFollowing=false, target=Player
[AI NPC] AGGRO! Starting to follow Player at distance 8.5m
[AI NPC] DE-AGGRO! Returning to patrol at distance 21.2m
[AI NPC] Waiting 1s before resuming patrol
[AI NPC] Resuming patrol, moving to point 2
- Всегда устанавливайте
targetдля Combined режима aggroDistance < maxFollowDistanceдля стабильности- Подписывайтесь на события для звуков и анимаций
- Визуализируйте Gizmos при настройке зон
- Используйте
patrolZoneдля открытых пространств (враги в зоне) - Используйте
patrolPointsдля структурированных маршрутов (обход постов)