NavMesh'им ботов:
Плюсы новой системы:
Я покажу передвижение ботов по NavMesh на примере замены стандартного состояния AIController ScriptedMove на ScriptedMove с использованием NavMesh.
Что такое Navmesh
Navmesh это замена стандартному способу поиска путей по вейпойнтам.Плюсы новой системы:
- Более быстрый поиск пути.
- Более точный поиск пути.
- Более быстрые проверки по ObstacleMesh и WalkableMesh.
- Простота создания NavMesh с точки зрения дизайнера уровней.
Что нужно, чтобы NavMesh заработал?
- Наличие NavMesh в уровне. (см. Туториал по NavMesh для дизайнеров by redbox )
- Реализация передвижения по NavMesh в коде.
Добавляем ботам возможность искать путь по NavMesh
Итак, добавляем две функции в контроллер ботов которые определены в базовом классе GameAIController.event bool GeneratePathToActor( Actor Goal, optional float WithinDistance, optional bool bAllowPartialPath )
{
// Clear cache and constraints (ignore recycling for the moment)
NavigationHandle.PathConstraintList = none;
NavigationHandle.PathGoalList = none;
// Create constraints
class'NavMeshPath_Toward'.static.TowardGoal( NavigationHandle, Goal );
class'NavMeshGoal_At'.static.AtActor( NavigationHandle, Goal );
// Find path
return NavigationHandle.FindPath();
}
event bool GeneratePathToLocation( Vector Goal, optional float WithinDistance, optional bool bAllowPartialPath )
{
// Clear cache and constraints (ignore recycling for the moment)
NavigationHandle.PathConstraintList = none;
NavigationHandle.PathGoalList = none;
// Create constraints
class'NavMeshPath_Toward'.static.TowardPoint( NavigationHandle, Goal );
class'NavMeshGoal_At'.static.AtLocation( NavigationHandle, Goal );
// Find path
return NavigationHandle.FindPath();
}
Поиском пути по NavMesh управляет NavigationHandle который находится в контроллере. Для того чтобы NavigationHandle мог найти путь ему нужну указать как его искать. В данном случае мы используем два ограничителя (NavMeshPath_Toward, NavMeshGoal_At). Для правильной работы NavigationHandle обязательно должен иметь ограничители типов NavMeshPathGoalEvaluator и NavMeshPathConstraint. Вы можете написать новые классы ограничителей сами, чтобы получить нестандартный поиск пути.Поехали
Путь мы нашли и теперь нам нужно сказать боту, что ему пора бы пойти... по этому пути. =)Я покажу передвижение ботов по NavMesh на примере замены стандартного состояния AIController ScriptedMove на ScriptedMove с использованием NavMesh.
var() Vector TempDest;
...
state ScriptedMove
{
Begin:
// while we have a valid pawn and move target, and
// we haven't reached the target yet
while( Pawn != None && ScriptedMoveTarget != None && !Pawn.ReachedDestination(ScriptedMoveTarget) )
{
if( GeneratePathToActor(ScriptedMoveTarget) )
{
//NavigationHandle.DrawPathCache(,TRUE);
// check to see if it is directly reachable
if( NavigationHandle.ActorReachable( ScriptedMoveTarget ) )
{
// then move directly to the actor
MoveToward( ScriptedMoveTarget, ScriptedFocus );
}
else
{
// move to the first node on the path
if( NavigationHandle.GetNextMoveLocation( TempDest, Pawn.GetCollisionRadius()/**0.8f*/) )
{
//DrawDebugCoordinateSystem(TempDest, rot(0,0,0),25.f,TRUE);
MoveTo( TempDest, ScriptedFocus );
}
else
{
//give up because the nav mesh did not have anything for you in the path
`warn("NavigationHandle.GetNextMoveLocation failed to find a destination for to"@ScriptedMoveTarget);
ScriptedMoveTarget = None;
break;
}
}
}
else
{
//give up because the nav mesh failed to find a path
`warn("FindNavMeshPath failed to find a path to"@ScriptedMoveTarget);
ScriptedMoveTarget = None;
}
}
// return to the previous state
PopState();
}
Все. Изучайте и экспериментируйте.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.