A* Pathfinding Project
4.1.3
The A* Pathfinding Project for Unity 3D
|
Generates a grid of nodes. More...
Generates a grid of nodes.
The GridGraph does exactly what the name implies, generates nodes in a grid pattern.
Grid graphs suit well to when you already have a grid based world. Features:
The The Snap Size button snaps the internal size of the graph to exactly contain the current number of nodes, i.e not contain 100.3 nodes but exactly 100 nodes.
This will make the "center" coordinate more accurate.
Updating the graph during runtime Any graph which implements the IUpdatableGraph interface can be updated during runtime.
For grid graphs this is a great feature since you can update only a small part of the grid without causing any lag like a complete rescan would.
If you for example just have instantiated a sphere obstacle in the scene and you want to update the grid where that sphere was instantiated, you can do this:
Where ob is the obstacle you just instantiated (a GameObject).
As you can see, the UpdateGraphs function takes a Bounds parameter and it will send an update call to all updateable graphs.
A grid graph will update that area and a small margin around it equal to collision testing diameter/2
Hexagon graphs The graph can be configured to work like a hexagon graph with some simple settings. Just set the neighbours (called 'connections' in the editor) field to 'Six' and then click the 'Configure as Hexagon Graph' button that will show up. That will set the isometricAngle field to 54.74 (more precisely 90-atan(1/sqrt(2))) and enable uniformEdgeCosts.
Then the graph will work like a hexagon graph. You might want to rotate it to better match your game however.
Note however that the snapping to the closest node is not exactly as you would expect in a real hexagon graph, but it is close enough that you will likely not notice.
Configure using code
Tree colliders It seems that Unity will only generate tree colliders at runtime when the game is started. For this reason, the grid graph will not pick up tree colliders when outside of play mode but it will pick them up once the game starts. If it still does not pick them up make sure that the trees actually have colliders attached to them and that the tree prefabs are in the correct layer (the layer should be included in the 'Collision Testing' mask).
Classes | |
class | TextureData |
Used for using a texture as a source for a grid graph. More... | |
Public Member Functions | |
GridGraph () | |
virtual void | CalculateConnections (GridNodeBase node) |
Calculates the grid connections for a single node. | |
virtual void | CalculateConnections (GridNode[] nodes, int x, int z, GridNode node) |
Calculates the grid connections for a single node. | |
virtual void | CalculateConnections (int x, int z, GridNode node) |
Calculates the grid connections for a single node. | |
virtual void | CalculateConnections (int x, int z) |
Calculates the grid connections for a single node. | |
GraphTransform | CalculateTransform () |
Returns a new transform which transforms graph space to world space. | |
bool | CheckConnection (GridNode node, int dir) |
Returns if node is connected to it's neighbour in the specified direction. | |
override int | CountNodes () |
Number of nodes in the graph. | |
virtual void | ErodeWalkableArea () |
Erodes the walkable area. | |
void | ErodeWalkableArea (int xmin, int zmin, int xmax, int zmax) |
Erodes the walkable area. | |
void | GenerateMatrix () |
Generates the matrix used for translating nodes from grid coordinates to world coordinates. | |
uint | GetConnectionCost (int dir) |
override NNInfoInternal | GetNearest (Vector3 position, NNConstraint constraint, GraphNode hint) |
Returns the nearest node to a position using the specified NNConstraint. | |
override NNInfoInternal | GetNearestForce (Vector3 position, NNConstraint constraint) |
Returns the nearest node to a position using the specified constraint . | |
GridNode | GetNodeConnection (GridNode node, int dir) |
override void | GetNodes (System.Action< GraphNode > action) |
Calls a delegate with all nodes in the graph. | |
List< GraphNode > | GetNodesInArea (Bounds bounds) |
List< GraphNode > | GetNodesInArea (GraphUpdateShape shape) |
List< GraphNode > | GetNodesInArea (Bounds bounds, GraphUpdateShape shape) |
List< GraphNode > | GetNodesInRegion (Bounds bounds) |
All nodes inside the bounding box. | |
List< GraphNode > | GetNodesInRegion (GraphUpdateShape shape) |
All nodes inside the shape. | |
virtual List< GraphNode > | GetNodesInRegion (IntRect rect) |
Get all nodes in a rectangle. | |
virtual int | GetNodesInRegion (IntRect rect, GridNodeBase[] buffer) |
Get all nodes in a rectangle. | |
Int3 | GraphPointToWorld (int x, int z, float height) |
Transform a point in graph space to world space. | |
bool | HasNodeConnection (GridNode node, int dir) |
bool | HasNodeConnection (int index, int x, int z, int dir) |
virtual bool | IsValidConnection (GridNodeBase node1, GridNodeBase node2) |
Returns true if a connection between the adjacent nodes n1 and n2 is valid. | |
bool | Linecast (Vector3 from, Vector3 to) |
Returns if there is an obstacle between from and to on the graph. | |
bool | Linecast (Vector3 from, Vector3 to, GraphNode hint) |
Returns if there is an obstacle between from and to on the graph. | |
bool | Linecast (Vector3 from, Vector3 to, GraphNode hint, out GraphHitInfo hit) |
Returns if there is an obstacle between from and to on the graph. | |
bool | Linecast (Vector3 from, Vector3 to, GraphNode hint, out GraphHitInfo hit, List< GraphNode > trace) |
Returns if there is an obstacle between from and to on the graph. | |
override void | OnDrawGizmos (RetainedGizmos gizmos, bool drawNodes) |
Draw gizmos for the graph. | |
virtual void | RecalculateCell (int x, int z, bool resetPenalties=true, bool resetTags=true) |
Recalculates single node in the graph. | |
override void | RelocateNodes (Matrix4x4 deltaMatrix) |
Moves the nodes in this graph. | |
void | RelocateNodes (Vector3 center, Quaternion rotation, float nodeSize, float aspectRatio=1, float isometricAngle=0) |
Relocate the grid graph using new settings. | |
void | SetDimensions (int width, int depth, float nodeSize) |
Updates unclampedSize from width, depth and nodeSize values. | |
void | SetNodeConnection (GridNode node, int dir, bool value) |
void | SetNodeConnection (int index, int x, int z, int dir, bool value) |
Set if connection in the specified direction should be enabled. | |
virtual void | SetUpOffsetsAndCosts () |
Sets up neighbourOffsets with the current settings. | |
bool | SnappedLinecast (Vector3 from, Vector3 to, GraphNode hint, out GraphHitInfo hit) |
Returns if there is an obstacle between from and to on the graph. | |
virtual void | UpdateNodePositionCollision (GridNode node, int x, int z, bool resetPenalty=true) |
Updates position, walkability and penalty for the node. | |
void | UpdateSizeFromWidthDepth () |
Updates unclampedSize from width, depth and nodeSize values. | |
void | UpdateTransform () |
Updates the transform field which transforms graph space to world space. | |
Public Member Functions inherited from NavGraph | |
NNInfoInternal | GetNearest (Vector3 position) |
Returns the nearest node to a position using the default NNConstraint. | |
NNInfoInternal | GetNearest (Vector3 position, NNConstraint constraint) |
Returns the nearest node to a position using the specified NNConstraint. | |
void | GetNodes (System.Func< GraphNode, bool > action) |
Calls a delegate with all nodes in the graph until the delegate returns false. | |
void | RelocateNodes (Matrix4x4 oldMatrix, Matrix4x4 newMatrix) |
Moves nodes in this graph. | |
void | Scan () |
Scan the graph. | |
void | ScanGraph () |
Scan the graph. | |
void | SetMatrix (Matrix4x4 m) |
Use to set both matrix and inverseMatrix at the same time. | |
Public Member Functions inherited from IGraphInternals | |
void | DeserializeExtraInfo (GraphSerializationContext ctx) |
void | DeserializeSettingsCompatibility (GraphSerializationContext ctx) |
void | DestroyAllNodes () |
void | OnDestroy () |
void | PostDeserialization (GraphSerializationContext ctx) |
IEnumerable< Progress > | ScanInternal () |
void | SerializeExtraInfo (GraphSerializationContext ctx) |
Public Member Functions inherited from IUpdatableGraph | |
GraphUpdateThreading | CanUpdateAsync (GraphUpdateObject o) |
void | UpdateArea (GraphUpdateObject o) |
Updates an area using the specified #GraphUpdateObject. | |
void | UpdateAreaInit (GraphUpdateObject o) |
May be called on the Unity thread before starting the update. | |
void | UpdateAreaPost (GraphUpdateObject o) |
May be called on the Unity thread after executing the update. | |
Public Member Functions inherited from IRaycastableGraph | |
bool | Linecast (Vector3 start, Vector3 end) |
bool | Linecast (Vector3 start, Vector3 end, GraphNode hint) |
bool | Linecast (Vector3 start, Vector3 end, GraphNode hint, out GraphHitInfo hit) |
bool | Linecast (Vector3 start, Vector3 end, GraphNode hint, out GraphHitInfo hit, List< GraphNode > trace) |
Static Public Member Functions | |
static void | CalculateConnections (GridNode node) |
Calculates the grid connections for a single node. | |
Public Attributes | |
const int | getNearestForceOverlap = 2 |
In GetNearestForce, determines how far to search after a valid node has been found. | |
readonly uint[] | neighbourCosts = new uint[8] |
Costs to neighbour nodes. | |
readonly int[] | neighbourOffsets = new int[8] |
Index offset to get neighbour nodes. | |
readonly int[] | neighbourXOffsets = new int[8] |
Offsets in the X direction for neighbour nodes. | |
readonly int[] | neighbourZOffsets = new int[8] |
Offsets in the Z direction for neighbour nodes. | |
GridNode[] | nodes |
All nodes in this graph. | |
Public Attributes inherited from NavGraph | |
AstarPath | active |
Reference to the AstarPath object in the scene. | |
bool | drawGizmos = true |
Enable to draw gizmos in the Unity scene view. | |
uint | graphIndex |
Index of the graph, used for identification purposes. | |
Guid | guid |
Used as an ID of the graph, considered to be unique. | |
bool | infoScreenOpen |
Used in the editor to check if the info screen is open. | |
uint | initialPenalty |
Default penalty to apply to all nodes. | |
Matrix4x4 | inverseMatrix = Matrix4x4.identity |
Inverse of matrix. | |
Matrix4x4 | matrix = Matrix4x4.identity |
A matrix for translating/rotating/scaling the graph. | |
string | name |
Name of the graph. | |
bool | open |
Is the graph open in the editor. | |
Protected Member Functions | |
void | CalculateAffectedRegions (GraphUpdateObject o, out IntRect originalRect, out IntRect affectRect, out IntRect physicsRect, out bool willChangeWalkability, out int erosion) |
bool | ClipLineSegmentToBounds (Vector3 a, Vector3 b, out Vector3 outA, out Vector3 outB) |
Clips a line segment in graph space to the graph bounds. | |
override void | DeserializeExtraInfo (GraphSerializationContext ctx) |
Deserializes graph type specific node data. | |
override void | DeserializeSettingsCompatibility (GraphSerializationContext ctx) |
An old format for serializing settings. | |
override void | DestroyAllNodes () |
Destroys all nodes in the graph. | |
virtual bool | ErosionAnyFalseConnections (GraphNode baseNode) |
True if the node has any blocked connections. | |
virtual List< GraphNode > | GetNodesInRegion (Bounds bounds, GraphUpdateShape shape) |
All nodes inside the shape or if null, the bounding box. | |
IntRect | GetRectFromBounds (Bounds bounds) |
A rect with all nodes that the bounds could touch. | |
override void | OnDestroy () |
This function will be called when this graph is destroyed. | |
override void | PostDeserialization (GraphSerializationContext ctx) |
Called after all deserialization has been done for all graphs. | |
override IEnumerable< Progress > | ScanInternal () |
Internal method to scan the graph. | |
override void | SerializeExtraInfo (GraphSerializationContext ctx) |
Serializes graph type specific node data. | |
Protected Member Functions inherited from NavGraph | |
void | DrawUnwalkableNodes (float size) |
Static Protected Member Functions | |
static float | CrossMagnitude (Vector2 a, Vector2 b) |
Magnitude of the cross product a x b. | |
Static Package Attributes | |
static readonly int[] | hexagonNeighbourIndices = { 0, 1, 5, 2, 3, 7 } |
Which neighbours are going to be used when neighbours=6. | |
Properties | |
int | Depth [get, set] |
virtual int | LayerCount [get] |
Number of layers in the graph. | |
Vector2 | size [get, set] |
Size of the grid. | |
GraphTransform | transform [get, set] |
Determines how the graph transforms graph space to world space. | |
virtual bool | uniformWidthDepthGrid [get] |
This is placed here so generators inheriting from this one can override it and set it to false. | |
int | Width [get, set] |
Properties inherited from NavGraph | |
bool | exists [get] |
True if the graph exists, false if it has been destroyed. | |
Properties inherited from ITransformedGraph | |
GraphTransform | transform [get] |
Private Member Functions | |
void | CalculateDimensions (out int width, out int depth, out float nodeSize) |
Calculates the width/depth of the graph from unclampedSize and nodeSize. | |
GraphUpdateThreading IUpdatableGraph. | CanUpdateAsync (GraphUpdateObject o) |
void | CreateNavmeshSurfaceVisualization (GridNodeBase[] nodes, int nodeCount, GraphGizmoHelper helper) |
Draw the surface as well as an outline of the grid graph. | |
void | ErodeNode (GraphNode node) |
Internal method used for erosion. | |
void | ErodeNodeWithTags (GraphNode node, int iteration) |
Internal method used for erosion. | |
void | ErodeNodeWithTagsInit (GraphNode node) |
Internal method used for erosion. | |
GridNode | GetNodeConnection (int index, int x, int z, int dir) |
Get the connecting node from the node at (x,z) in the specified direction. | |
void | RemoveGridGraphFromStatic () |
void IUpdatableGraph. | UpdateArea (GraphUpdateObject o) |
Internal function to update an area of the graph. | |
void IUpdatableGraph. | UpdateAreaInit (GraphUpdateObject o) |
void IUpdatableGraph. | UpdateAreaPost (GraphUpdateObject o) |
Inspector - Settings | |
bool | useRaycastNormal [get] |
Use heigh raycasting normal for max slope calculation. | |
int | width |
Width of the grid in nodes. | |
int | depth |
Depth (height) of the grid in nodes. | |
float | aspectRatio = 1F |
Scaling of the graph along the X axis. | |
float | isometricAngle |
Angle to use for the isometric projection. | |
bool | uniformEdgeCosts |
If true, all edge costs will be set to the same value. | |
Vector3 | rotation |
Rotation of the grid in degrees. | |
Vector3 | center |
Center point of the grid. | |
Vector2 | unclampedSize |
Size of the grid. | |
float | nodeSize = 1 |
Size of one node in world units. | |
GraphCollision | collision |
Settings on how to check for walkability and height. | |
float | maxClimb = 0.4F |
The max position difference between two nodes to enable a connection. | |
float | maxSlope = 90 |
The max slope in degrees for a node to be walkable. | |
int | erodeIterations |
Erosion of the graph. | |
bool | erosionUseTags |
Use tags instead of walkability for erosion. | |
int | erosionFirstTag = 1 |
Tag to start from when using tags for erosion. | |
NumNeighbours | neighbours = NumNeighbours.Eight |
Number of neighbours for each node. | |
bool | cutCorners = true |
If disabled, will not cut corners on obstacles. | |
float | penaltyPositionOffset |
Offset for the position when calculating penalty. | |
bool | penaltyPosition |
Use position (y-coordinate) to calculate penalty. | |
float | penaltyPositionFactor = 1F |
Scale factor for penalty when calculating from position. | |
bool | penaltyAngle |
float | penaltyAngleFactor = 100F |
How much penalty is applied depending on the slope of the terrain. | |
float | penaltyAnglePower = 1 |
How much extra to penalize very steep angles. | |
bool | useJumpPointSearch |
bool | showMeshOutline = true |
Show an outline of the grid nodes in the Unity Editor. | |
bool | showNodeConnections |
Show the connections between the grid nodes in the Unity Editor. | |
bool | showMeshSurface = true |
Show the surface of the graph. | |
TextureData | textureData = new TextureData() |
Holds settings for using a texture as source for a grid graph. | |
GridGraph | ( | ) |
|
protected |
|
static |
Calculates the grid connections for a single node.
|
virtual |
Calculates the grid connections for a single node.
Convenience function, it's slightly faster to use CalculateConnections(int,int) but that will only show when calculating for a large number of nodes. This function will also work for both grid graphs and layered grid graphs.
Reimplemented in LayerGridGraph.
Calculates the grid connections for a single node.
|
virtual |
Calculates the grid connections for a single node.
|
virtual |
Calculates the grid connections for a single node.
Note that to ensure that connections are completely up to date after updating a node you have to calculate the connections for both the changed node and its neighbours.
In a layered grid graph, this will recalculate the connections for all nodes in the (x,z) cell (it may have multiple layers of nodes).
Reimplemented in LayerGridGraph.
|
private |
Calculates the width/depth of the graph from unclampedSize and nodeSize.
The node size may be changed due to constraints that the width/depth is not allowed to be larger than 1024 (artificial limit).
GraphTransform CalculateTransform | ( | ) |
Returns a new transform which transforms graph space to world space.
Does not update the transform field.
|
private |
bool CheckConnection | ( | GridNode | node, |
int | dir | ||
) |
Returns if node is connected to it's neighbour in the specified direction.
This will also return true if neighbours = NumNeighbours.Four, the direction is diagonal and one can move through one of the adjacent nodes to the targeted node.
|
protected |
Clips a line segment in graph space to the graph bounds.
That is (0,0,0) is the bottom left corner of the graph and (width,0,depth) is the top right corner. The first node is placed at (0.5,y,0.5). One unit distance is the same as nodeSize.
Returns false if the line segment does not intersect the graph at all.
|
virtual |
Number of nodes in the graph.
Note that this is, unless the graph type has overriden it, an O(n) operation.
This is an O(1) operation for grid graphs and point graphs. For layered grid graphs it is an O(n) operation.
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
private |
Draw the surface as well as an outline of the grid graph.
The nodes will be drawn as squares (or hexagons when using neighbours = Six).
|
staticprotected |
Magnitude of the cross product a x b.
|
protectedvirtual |
Deserializes graph type specific node data.
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
protectedvirtual |
An old format for serializing settings.
Reimplemented from NavGraph.
|
protectedvirtual |
Destroys all nodes in the graph.
Reimplemented from NavGraph.
|
private |
Internal method used for erosion.
|
private |
Internal method used for erosion.
|
private |
Internal method used for erosion.
|
virtual |
Erodes the walkable area.
void ErodeWalkableArea | ( | int | xmin, |
int | zmin, | ||
int | xmax, | ||
int | zmax | ||
) |
|
protectedvirtual |
True if the node has any blocked connections.
For 4 and 8 neighbours the 4 axis aligned connections will be checked. For 6 neighbours all 6 neighbours will be checked.
Internal method used for erosion.
Reimplemented in LayerGridGraph.
void GenerateMatrix | ( | ) |
Generates the matrix used for translating nodes from grid coordinates to world coordinates.
uint GetConnectionCost | ( | int | dir | ) |
|
virtual |
Returns the nearest node to a position using the specified NNConstraint.
position | The position to try to find a close node to |
hint | Can be passed to enable some graph generators to find the nearest node faster. |
constraint | Can for example tell the function to try to return a walkable node. If you do not get a good node back, consider calling GetNearestForce. |
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
virtual |
Returns the nearest node to a position using the specified constraint .
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
private |
|
virtual |
Calls a delegate with all nodes in the graph.
This is the primary way of iterating through all nodes in a graph.
Do not change the graph structure inside the delegate.
If you want to store all nodes in a list you can do this
Implements NavGraph.
Reimplemented in LayerGridGraph.
List<GraphNode> GetNodesInArea | ( | Bounds | bounds | ) |
List<GraphNode> GetNodesInArea | ( | GraphUpdateShape | shape | ) |
List<GraphNode> GetNodesInArea | ( | Bounds | bounds, |
GraphUpdateShape | shape | ||
) |
List<GraphNode> GetNodesInRegion | ( | Bounds | bounds | ) |
All nodes inside the bounding box.
List<GraphNode> GetNodesInRegion | ( | GraphUpdateShape | shape | ) |
All nodes inside the shape.
|
protectedvirtual |
All nodes inside the shape or if null, the bounding box.
If a shape is supplied, it is assumed to be contained inside the bounding box.
Reimplemented in LayerGridGraph.
Get all nodes in a rectangle.
rect | Region in which to return nodes. It will be clamped to the grid. |
Reimplemented in LayerGridGraph.
|
virtual |
Get all nodes in a rectangle.
rect | Region in which to return nodes. It will be clamped to the grid. |
buffer | Buffer in which the nodes will be stored. Should be at least as large as the number of nodes that can exist in that region. |
Reimplemented in LayerGridGraph.
|
protected |
A rect with all nodes that the bounds could touch.
This correctly handles rotated graphs and other transformations. The returned rect is guaranteed to not extend outside the graph bounds.
Int3 GraphPointToWorld | ( | int | x, |
int | z, | ||
float | height | ||
) |
Transform a point in graph space to world space.
This will give you the node position for the node at the given x and z coordinate if it is at the specified height above the base of the graph.
bool HasNodeConnection | ( | GridNode | node, |
int | dir | ||
) |
bool HasNodeConnection | ( | int | index, |
int | x, | ||
int | z, | ||
int | dir | ||
) |
|
virtual |
Returns true if a connection between the adjacent nodes n1 and n2 is valid.
Also takes into account if the nodes are walkable.
This method may be overriden if you want to customize what connections are valid. It must however hold that IsValidConnection(a,b) == IsValidConnection(b,a).
This is used for calculating the connections when the graph is scanned or updated.
bool Linecast | ( | Vector3 | from, |
Vector3 | to | ||
) |
Returns if there is an obstacle between from and to on the graph.
This is not the same as Physics.Linecast, this function traverses the graph and looks for collisions.
bool Linecast | ( | Vector3 | from, |
Vector3 | to, | ||
GraphNode | hint | ||
) |
Returns if there is an obstacle between from and to on the graph.
[in] | from | Point to linecast from |
[in] | to | Point to linecast to |
[in] | hint | If you have some idea of what the start node might be (the one close to from), pass it to hint since it can enable faster lookups |
This is not the same as Physics.Linecast, this function traverses the graph and looks for collisions.
bool Linecast | ( | Vector3 | from, |
Vector3 | to, | ||
GraphNode | hint, | ||
out GraphHitInfo | hit | ||
) |
Returns if there is an obstacle between from and to on the graph.
[in] | from | Point to linecast from |
[in] | to | Point to linecast to |
[out] | hit | Contains info on what was hit, see GraphHitInfo |
[in] | hint | If you have some idea of what the start node might be (the one close to _a), pass it to hint since it can enable faster lookups |
This is not the same as Physics.Linecast, this function traverses the graph and looks for collisions.
bool Linecast | ( | Vector3 | from, |
Vector3 | to, | ||
GraphNode | hint, | ||
out GraphHitInfo | hit, | ||
List< GraphNode > | trace | ||
) |
Returns if there is an obstacle between from and to on the graph.
[in] | from | Point to linecast from |
[in] | to | Point to linecast to |
[out] | hit | Contains info on what was hit, see GraphHitInfo |
[in] | hint | This parameter is deprecated. It will be ignored. |
trace | If a list is passed, then it will be filled with all nodes the linecast traverses |
This is not the same as Physics.Linecast, this function traverses the graph and looks for collisions.
It uses a method similar to Bresenham's line algorithm but it has been extended to allow the start and end points to lie on non-integer coordinates (which makes the math a bit trickier).
|
protectedvirtual |
This function will be called when this graph is destroyed.
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
virtual |
Draw gizmos for the graph.
Reimplemented from NavGraph.
|
protectedvirtual |
Called after all deserialization has been done for all graphs.
Can be used to set up more graph data which is not serialized
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
|
virtual |
Recalculates single node in the graph.
For a layered grid graph this will recalculate all nodes at a specific (x,z) cell in the grid. For grid graphs this will simply recalculate the single node at those coordinates.
x | X coordinate of the cell |
z | Z coordinate of the cell |
resetPenalties | If true, the penalty of the nodes will be reset to the initial value as if the graph had just been scanned (this excludes texture data however which is only done when scanning the graph). |
resetTags | If true, the tag will be reset to zero (the default tag). |
Reimplemented in LayerGridGraph.
|
virtual |
Moves the nodes in this graph.
Multiplies all node positions by deltaMatrix.
For example if you want to move all your nodes in e.g a point graph 10 units along the X axis from the initial position
Reimplemented from NavGraph.
void RelocateNodes | ( | Vector3 | center, |
Quaternion | rotation, | ||
float | nodeSize, | ||
float | aspectRatio = 1 , |
||
float | isometricAngle = 0 |
||
) |
Relocate the grid graph using new settings.
This will move all nodes in the graph to new positions which matches the new settings.
|
private |
|
protectedvirtual |
Internal method to scan the graph.
Called from AstarPath.ScanAsync. Override this function to implement custom scanning logic. Progress objects can be yielded to show progress info in the editor and to split up processing over several frames when using async scanning.
Implements NavGraph.
Reimplemented in LayerGridGraph.
|
protectedvirtual |
Serializes graph type specific node data.
This function can be overriden to serialize extra node information (or graph information for that matter) which cannot be serialized using the standard serialization. Serialize the data in any way you want and return a byte array. When loading, the exact same byte array will be passed to the DeserializeExtraInfo function.
These functions will only be called if node serialization is enabled.
Reimplemented from NavGraph.
Reimplemented in LayerGridGraph.
void SetDimensions | ( | int | width, |
int | depth, | ||
float | nodeSize | ||
) |
Updates unclampedSize from width, depth and nodeSize values.
Also generates a new matrix .
You should use this method instead of setting the width and depth fields as the grid dimensions are not defined by the width and depth variables but by the unclampedSize and center variables.
void SetNodeConnection | ( | GridNode | node, |
int | dir, | ||
bool | value | ||
) |
void SetNodeConnection | ( | int | index, |
int | x, | ||
int | z, | ||
int | dir, | ||
bool | value | ||
) |
Set if connection in the specified direction should be enabled.
Note that bounds checking will still be done when getting the connection value again, so it is not necessarily true that HasNodeConnection will return true just because you used SetNodeConnection on a node to set a connection to true.
index | Index of the node |
x | X coordinate of the node |
z | Z coordinate of the node |
dir | Direction from 0 up to but excluding 8. |
value | Enable or disable the connection |
|
virtual |
Sets up neighbourOffsets with the current settings.
neighbourOffsets, neighbourCosts, neighbourXOffsets and neighbourZOffsets are set up.
The cost for a non-diagonal movement between two adjacent nodes is RoundToInt (nodeSize * Int3.Precision)
The cost for a diagonal movement between two adjacent nodes is RoundToInt (nodeSize * Sqrt (2) * Int3.Precision)
bool SnappedLinecast | ( | Vector3 | from, |
Vector3 | to, | ||
GraphNode | hint, | ||
out GraphHitInfo | hit | ||
) |
Returns if there is an obstacle between from and to on the graph.
This function is different from the other Linecast functions since it 1) snaps the start and end positions directly to the graph.
[in] | from | Point to linecast from |
[in] | to | Point to linecast to |
[out] | hit | Contains info on what was hit, see GraphHitInfo |
[in] | hint |
This is not the same as Physics.Linecast, this function traverses the graph and looks for collisions.
|
private |
Internal function to update an area of the graph.
|
private |
|
private |
|
virtual |
Updates position, walkability and penalty for the node.
Assumes that collision.Initialize (...) has been called before this function
void UpdateSizeFromWidthDepth | ( | ) |
Updates unclampedSize from width, depth and nodeSize values.
void UpdateTransform | ( | ) |
Updates the transform field which transforms graph space to world space.
In graph space all nodes are laid out in the XZ plane with the first node having a corner in the origin. One unit in graph space is one node so the first node in the graph is at (0.5,0) the second one at (1.5,0) etc.
This takes the current values of the parameters such as position and rotation into account the transform that was used the last time the graph was scanned is stored in the transform field.
The transform field is calculated using this method when the graph is scanned. The width, depth variables are also updated based on the unclampedSize field.
float aspectRatio = 1F |
Scaling of the graph along the X axis.
This should be used if you want different scales on the X and Y axis of the grid
Vector3 center |
Center point of the grid.
GraphCollision collision |
Settings on how to check for walkability and height.
bool cutCorners = true |
If disabled, will not cut corners on obstacles.
If connections is Eight, obstacle corners might be cut by a connection, setting this to false disables that.
int depth |
Depth (height) of the grid in nodes.
int erodeIterations |
Erosion of the graph.
The graph can be eroded after calculation. This means a margin is put around unwalkable nodes or other unwalkable connections. It is really good if your graph contains ledges where the nodes without erosion are walkable too close to the edge.
Below is an image showing a graph with erode iterations 0, 1 and 2
int erosionFirstTag = 1 |
Tag to start from when using tags for erosion.
bool erosionUseTags |
Use tags instead of walkability for erosion.
Tags will be used for erosion instead of marking nodes as unwalkable. The nodes will be marked with tags in an increasing order starting with the tag erosionFirstTag. Debug with the Tags mode to see the effect. With this enabled you can in effect set how close different AIs are allowed to get to walls using the Valid Tags field on the Seeker component.
const int getNearestForceOverlap = 2 |
In GetNearestForce, determines how far to search after a valid node has been found.
|
staticpackage |
Which neighbours are going to be used when neighbours=6.
float isometricAngle |
Angle to use for the isometric projection.
If you are making a 2D isometric game, you may want to use this parameter to adjust the layout of the graph to match your game. This will essentially scale the graph along one of its diagonals to produce something like this:
A perspective view of an isometric graph.
A top down view of an isometric graph. Note that the graph is entirely 2D, there is no perspective in this image.
Usually the angle that you want to use is either 30 degrees (alternatively 90-30 = 60 degrees) or atan(1/sqrt(2)) which is approximately 35.264 degrees (alternatively 90 - 35.264 = 54.736 degrees). You might also want to rotate the graph plus or minus 45 degrees around the Y axis to get the oritientation required for your game.
You can read more about it on the wikipedia page linked below.
float maxClimb = 0.4F |
The max position difference between two nodes to enable a connection.
Set to 0 to ignore the value.
float maxSlope = 90 |
The max slope in degrees for a node to be walkable.
readonly uint [] neighbourCosts = new uint[8] |
Costs to neighbour nodes.
readonly int [] neighbourOffsets = new int[8] |
Index offset to get neighbour nodes.
Added to a node's index to get a neighbour node index.
NumNeighbours neighbours = NumNeighbours.Eight |
Number of neighbours for each node.
Either four, six, eight connections per node.
Six connections is primarily for emulating hexagon graphs.
readonly int [] neighbourXOffsets = new int[8] |
Offsets in the X direction for neighbour nodes.
Only 1, 0 or -1
readonly int [] neighbourZOffsets = new int[8] |
Offsets in the Z direction for neighbour nodes.
Only 1, 0 or -1
GridNode [] nodes |
All nodes in this graph.
Nodes are laid out row by row.
The first node has grid coordinates X=0, Z=0, the second one X=1, Z=0
the last one has grid coordinates X=width-1, Z=depth-1.
float nodeSize = 1 |
Size of one node in world units.
bool penaltyAngle |
float penaltyAngleFactor = 100F |
How much penalty is applied depending on the slope of the terrain.
At a 90 degree slope (not that exactly 90 degree slopes can occur, but almost 90 degree), this penalty is applied. At a 45 degree slope, half of this is applied and so on. Note that you may require very large values, a value of 1000 is equivalent to the cost of moving 1 world unit.
float penaltyAnglePower = 1 |
How much extra to penalize very steep angles.
bool penaltyPosition |
Use position (y-coordinate) to calculate penalty.
float penaltyPositionFactor = 1F |
Scale factor for penalty when calculating from position.
float penaltyPositionOffset |
Offset for the position when calculating penalty.
Vector3 rotation |
Rotation of the grid in degrees.
bool showMeshOutline = true |
Show an outline of the grid nodes in the Unity Editor.
bool showMeshSurface = true |
Show the surface of the graph.
Each node will be drawn as a square (unless e.g hexagon graph mode has been enabled).
bool showNodeConnections |
Show the connections between the grid nodes in the Unity Editor.
TextureData textureData = new TextureData() |
Holds settings for using a texture as source for a grid graph.
Texure data can be used for fine grained control over how the graph will look. It can be used for positioning, penalty and walkability control.
Below is a screenshot of a grid graph with a penalty map applied. It has the effect of the AI taking the longer path along the green (low penalty) areas.
Vector2 unclampedSize |
Size of the grid.
Might be negative or smaller than nodeSize
bool uniformEdgeCosts |
If true, all edge costs will be set to the same value.
If false, diagonals will cost more. This is useful for a hexagon graph where the diagonals are actually the same length as the normal edges (since the graph has been skewed)
bool useJumpPointSearch |
int width |
Width of the grid in nodes.
|
getset |
|
get |
Number of layers in the graph.
For grid graphs this is always 1, for layered grid graphs it can be higher. The nodes array has the size width*depth*layerCount.
|
getset |
|
getset |
Determines how the graph transforms graph space to world space.
|
get |
This is placed here so generators inheriting from this one can override it and set it to false.
If it is true, it means that the nodes array's length will always be equal to width*depth It is used mainly in the editor to do auto-scanning calls, setting it to false for a non-uniform grid will reduce the number of scans
|
get |
Use heigh raycasting normal for max slope calculation.
True if maxSlope is less than 90 degrees.
|
getset |