A* Pathfinding Project  4.2.1
The A* Pathfinding Project for Unity 3D
RichFunnel Class Reference

Public Member Functions

 RichFunnel ()
 
void BuildFunnelCorridor (List< GraphNode > nodes, int start, int end)
 Build a funnel corridor from a node list slice. More...
 
Vector3 ClampToNavmesh (Vector3 position)
 Clamps the position to the navmesh and repairs the path if the agent has moved slightly outside it. More...
 
void FindWalls (List< Vector3 > wallBuffer, float range)
 Fill wallBuffer with all navmesh wall segments close to the current position. More...
 
RichFunnel Initialize (RichPath path, NavmeshBase graph)
 Works like a constructor, but can be used even for pooled objects. More...
 
override void OnEnterPool ()
 
Vector3 Update (Vector3 position, List< Vector3 > buffer, int numCorners, out bool lastCorner, out bool requiresRepath)
 Find the next points to move towards and clamp the position to the navmesh. More...
 

Public Attributes

Vector3 exactEnd
 
Vector3 exactStart
 
bool funnelSimplification = true
 Post process the funnel corridor or not. More...
 

Properties

TriangleMeshNode CurrentNode [get]
 
float DistanceToEndOfPath [get]
 Approximate distance (as the crow flies) to the endpoint of this path part. More...
 

Private Member Functions

bool CheckForDestroyedNodes ()
 True if any node in the path is destroyed. More...
 
bool ClampToNavmeshInternal (ref Vector3 position)
 Searches for the node the agent is inside. More...
 
bool FindNextCorners (Vector3 origin, int startIndex, List< Vector3 > funnelPath, int numCorners, out bool lastCorner)
 
void FindWalls (int nodeIndex, List< Vector3 > wallBuffer, Vector3 position, float range)
 
void SimplifyPath (IRaycastableGraph graph, List< GraphNode > nodes, int start, int end, List< GraphNode > result, Vector3 startPoint, Vector3 endPoint)
 Simplifies a funnel path using linecasting. More...
 
void UpdateFunnelCorridor (int splitIndex, List< TriangleMeshNode > prefix)
 Split funnel at node index splitIndex and throw the nodes up to that point away and replace with prefix. More...
 

Private Attributes

int checkForDestroyedNodesCounter
 
int currentNode
 
Vector3 currentPosition
 
NavmeshBase graph
 
readonly List< Vector3 > left
 
List< TriangleMeshNodenodes
 
RichPath path
 
readonly List< Vector3 > right
 
int [] triBuffer = new int[3]
 

Static Private Attributes

static Dictionary< TriangleMeshNode, TriangleMeshNodenavmeshClampDict = new Dictionary<TriangleMeshNode, TriangleMeshNode>()
 Cached object to avoid unnecessary allocations. More...
 
static List< TriangleMeshNodenavmeshClampList = new List<TriangleMeshNode>()
 Cached object to avoid unnecessary allocations. More...
 
static Queue< TriangleMeshNodenavmeshClampQueue = new Queue<TriangleMeshNode>()
 Cached object to avoid unnecessary allocations. More...
 

Constructor & Destructor Documentation

◆ RichFunnel()

Member Function Documentation

◆ BuildFunnelCorridor()

void BuildFunnelCorridor ( List< GraphNode nodes,
int  start,
int  end 
)

Build a funnel corridor from a node list slice.

The nodes are assumed to be of type TriangleMeshNode.

Parameters
nodesNodes to build the funnel corridor from
startStart index in the nodes list
endEnd index in the nodes list, this index is inclusive

◆ CheckForDestroyedNodes()

bool CheckForDestroyedNodes ( )
private

True if any node in the path is destroyed.

◆ ClampToNavmesh()

Vector3 ClampToNavmesh ( Vector3  position)

Clamps the position to the navmesh and repairs the path if the agent has moved slightly outside it.

You should not call this method with anything other than the agent's position.

◆ ClampToNavmeshInternal()

bool ClampToNavmeshInternal ( ref Vector3  position)
private

Searches for the node the agent is inside.

This will also clamp the position to the navmesh and repair the funnel cooridor if the agent moves slightly outside it.

Returns
True if nodes along the path have been destroyed so that a path recalculation is required

◆ FindNextCorners()

bool FindNextCorners ( Vector3  origin,
int  startIndex,
List< Vector3 >  funnelPath,
int  numCorners,
out bool  lastCorner 
)
private

◆ FindWalls() [1/2]

void FindWalls ( List< Vector3 >  wallBuffer,
float  range 
)

Fill wallBuffer with all navmesh wall segments close to the current position.

A wall segment is a node edge which is not shared by any other neighbour node, i.e an outer edge on the navmesh.

◆ FindWalls() [2/2]

void FindWalls ( int  nodeIndex,
List< Vector3 >  wallBuffer,
Vector3  position,
float  range 
)
private

◆ Initialize()

RichFunnel Initialize ( RichPath  path,
NavmeshBase  graph 
)

Works like a constructor, but can be used even for pooled objects.

Returns this for easy chaining

◆ OnEnterPool()

override void OnEnterPool ( )
virtual

Implements RichPathPart.

◆ SimplifyPath()

void SimplifyPath ( IRaycastableGraph  graph,
List< GraphNode nodes,
int  start,
int  end,
List< GraphNode result,
Vector3  startPoint,
Vector3  endPoint 
)
private

Simplifies a funnel path using linecasting.

Running time is roughly O(n^2 log n) in the worst case (where n = end-start) Actually it depends on how the graph looks, so in theory the actual upper limit on the worst case running time is O(n*m log n) (where n = end-start and m = nodes in the graph) but O(n^2 log n) is a much more realistic worst case limit.

Requires graph to implement IRaycastableGraph

◆ Update()

Vector3 Update ( Vector3  position,
List< Vector3 >  buffer,
int  numCorners,
out bool  lastCorner,
out bool  requiresRepath 
)

Find the next points to move towards and clamp the position to the navmesh.

Parameters
positionThe position of the agent.
bufferWill be filled with up to numCorners points which are the next points in the path towards the target.
numCornersSee buffer.
lastCornerTrue if the buffer contains the end point of the path.
requiresRepathTrue if nodes along the path have been destroyed and a path recalculation is necessary.
Returns
The position of the agent clamped to make sure it is inside the navmesh.

◆ UpdateFunnelCorridor()

void UpdateFunnelCorridor ( int  splitIndex,
List< TriangleMeshNode prefix 
)
private

Split funnel at node index splitIndex and throw the nodes up to that point away and replace with prefix.

Used when the AI has happened to get sidetracked and entered a node outside the funnel.

Member Data Documentation

◆ checkForDestroyedNodesCounter

int checkForDestroyedNodesCounter
private

◆ currentNode

int currentNode
private

◆ currentPosition

Vector3 currentPosition
private

◆ exactEnd

Vector3 exactEnd

◆ exactStart

Vector3 exactStart

◆ funnelSimplification

bool funnelSimplification = true

Post process the funnel corridor or not.

◆ graph

NavmeshBase graph
private

◆ left

readonly List<Vector3> left
private

◆ navmeshClampDict

Dictionary<TriangleMeshNode, TriangleMeshNode> navmeshClampDict = new Dictionary<TriangleMeshNode, TriangleMeshNode>()
staticprivate

Cached object to avoid unnecessary allocations.

◆ navmeshClampList

List<TriangleMeshNode> navmeshClampList = new List<TriangleMeshNode>()
staticprivate

Cached object to avoid unnecessary allocations.

◆ navmeshClampQueue

Queue<TriangleMeshNode> navmeshClampQueue = new Queue<TriangleMeshNode>()
staticprivate

Cached object to avoid unnecessary allocations.

◆ nodes

List<TriangleMeshNode> nodes
private

◆ path

RichPath path
private

◆ right

readonly List<Vector3> right
private

◆ triBuffer

int [] triBuffer = new int[3]
private

Property Documentation

◆ CurrentNode

TriangleMeshNode CurrentNode
get

◆ DistanceToEndOfPath

float DistanceToEndOfPath
get

Approximate distance (as the crow flies) to the endpoint of this path part.

See also
exactEnd

The documentation for this class was generated from the following file: