A* Pathfinding Project
4.0.10
The A* Pathfinding Project for Unity 3D
|
AI for following paths. More...
AI for following paths.
This AI is the default movement script which comes with the A* Pathfinding Project. It is in no way required by the rest of the system, so feel free to write your own. But I hope this script will make it easier to set up movement for the characters in your game. This script works well for many types of units, but if you need the highest performance (for example if you are moving hundreds of characters) you may want to customize this script or write a custom movement script to be able to optimize it specifically for your game.
This script will try to follow a target transform. At regular intervals, the path to that target will be recalculated. It will in the Update method try to move towards the next point in the path. However it will only move in roughly forward direction (Z+ axis) of the character, but it will rotate around it's Y-axis to make it possible to reach the target.
In the inspector in Unity, you will see a bunch of variables. You can view detailed information further down, but here's a quick overview.
The repathRate determines how often it will search for new paths, if you have fast moving targets, you might want to set it to a lower value.
The target variable is where the AI will try to move, it can be a point on the ground where the player has clicked in an RTS for example. Or it can be the player object in a zombie game.
The speed is self-explanatory, so is rotationSpeed, however slowdownDistance might require some explanation. It is the approximate distance from the target where the AI will start to slow down.
pickNextWaypointDist is simply determines within what range it will switch to target the next waypoint in the path.
Below is an image illustrating several variables as well as some internal ones, but which are relevant for understanding how it works.
Public Member Functions | |
Vector3 | CalculateVelocity (Vector3 position) |
Current desired velocity of the agent (excluding physics and local avoidance but it includes gravity). | |
virtual Vector3 | GetFeetPosition () |
void | OnDisable () |
virtual void | OnPathComplete (Path _p) |
Called when a requested path has finished calculation. | |
virtual void | OnTargetReached () |
virtual void | SearchPath () |
Requests a path to the target. | |
float | TrySearchPath () |
Tries to search for a path. | |
Public Attributes | |
bool | alwaysDrawGizmos |
Draws detailed gizmos constantly in the scene view instead of only when the agent is selected and settings are being modified. | |
bool | canMove = true |
Enables or disables movement. | |
bool | canSearch = true |
Enables or disables searching for paths. | |
float | endReachedDistance = 0.2F |
Distance to the end point to consider the end of path to be reached. | |
float | pickNextWaypointDist = 2 |
Determines within what range it will switch to target the next waypoint in the path. | |
float | repathRate = 0.5F |
Determines how often it will search for new paths. | |
float | rotationSpeed = 360 |
Rotation speed. | |
float | slowdownDistance = 0.6F |
Distance from the target point where the AI will start to slow down. | |
float | speed = 3 |
Maximum velocity. | |
Transform | target |
Target to move towards. | |
Public Attributes inherited from AIBase | |
float | centerOffset = 1 |
Offset along the Y coordinate for the ground raycast start position. | |
Vector3 | gravity = new Vector3(float.NaN, float.NaN, float.NaN) |
Gravity to use. | |
LayerMask | groundMask = -1 |
Layer mask to use for ground placement. | |
bool | rotationIn2D = false |
If true, the forward axis of the character will be along the Y axis instead of the Z axis. | |
Protected Member Functions | |
override void | MovementUpdate (float deltaTime) |
Called during either Update or FixedUpdate depending on if rigidbodies are used for movement or not. | |
virtual void | OnEnable () |
Called when the component is enabled. | |
override int | OnUpgradeSerializedData (int version) |
Handle serialization backwards compatibility. | |
IEnumerator | RepeatTrySearchPath () |
Tries to search for a path every repathRate seconds. | |
virtual void | Start () |
Starts searching for paths. | |
Protected Member Functions inherited from AIBase | |
void | ApplyGravity (float deltaTime) |
override void | Awake () |
Initializes reference variables. | |
Vector2 | CalculateDeltaToMoveThisFrame (Vector2 position, float distanceToEndOfPath, float deltaTime) |
virtual Vector3 | ClampToNavmesh (Vector3 position) |
Constrains the character's position to lie on the navmesh. | |
virtual void | FixedUpdate () |
Called every physics update. | |
void | Move (Vector3 position3D, Vector3 deltaPosition) |
virtual void | OnDrawGizmos () |
Vector3 | RaycastPosition (Vector3 position, float lastElevation) |
Find the world position of the ground below the character. | |
virtual void | RotateTowards (Vector2 direction, float maxDegrees) |
Rotates in the specified direction. | |
virtual void | Update () |
Called every frame. | |
Protected Attributes | |
bool | canSearchAgain = true |
Only when the previous path has been returned should be search for a new path. | |
PathInterpolator | interpolator = new PathInterpolator() |
float | lastRepath = -9999 |
Time when the last path request was sent. | |
Path | path |
Current path which is followed. | |
Vector3 | targetPoint |
Point to where the AI is heading. | |
Vector3 | velocity |
Protected Attributes inherited from AIBase | |
CharacterController | controller |
Cached CharacterController component. | |
IMovementPlane | movementPlane = GraphTransform.identityTransform |
Rigidbody | rigid |
Cached Rigidbody component. | |
Rigidbody2D | rigid2D |
Cached Rigidbody component. | |
RVOController | rvoController |
Cached RVOController component. | |
Seeker | seeker |
Cached Seeker component. | |
Transform | tr |
Cached Transform component. | |
Vector2 | velocity2D |
Current desired velocity of the agent. | |
float | verticalVelocity |
Velocity due to gravity. | |
Properties | |
Vector3 | targetDirection [get] |
Direction that the agent wants to move in (excluding physics and local avoidance). | |
bool | TargetReached [get, set] |
True if the end of the path has been reached. | |
float | turningSpeed [get, set] |
Rotation speed. | |
Properties inherited from AIBase | |
bool | usingGravity [get, set] |
Indicates if gravity is used during this frame. | |
Private Member Functions | |
void | Init () |
Private Attributes | |
bool | startHasRun = false |
True if the Start function has been executed. | |
Additional Inherited Members | |
Static Protected Attributes inherited from AIBase | |
static readonly Color | GizmoColorRaycast = new Color(118.0f/255, 206.0f/255, 112.0f/255) |
Vector3 CalculateVelocity | ( | Vector3 | position | ) |
Current desired velocity of the agent (excluding physics and local avoidance but it includes gravity).
|
virtual |
|
private |
|
protectedvirtual |
Called during either Update or FixedUpdate depending on if rigidbodies are used for movement or not.
Implements AIBase.
void OnDisable | ( | ) |
|
protectedvirtual |
Called when the component is enabled.
|
virtual |
Called when a requested path has finished calculation.
A path is first requested by SearchPath, it is then calculated, probably in the same or the next frame. Finally it is returned to the seeker which forwards it to this function.
Reimplemented in LegacyAIPath.
|
virtual |
Reimplemented in MineBotAI.
|
protectedvirtual |
Handle serialization backwards compatibility.
Reimplemented from VersionedMonoBehaviour.
|
protected |
Tries to search for a path every repathRate seconds.
|
virtual |
Requests a path to the target.
|
protectedvirtual |
float TrySearchPath | ( | ) |
Tries to search for a path.
Will search for a new path if there was a sufficient time since the last repath and both canSearchAgain and canSearch are true and there is a target.
bool alwaysDrawGizmos |
Draws detailed gizmos constantly in the scene view instead of only when the agent is selected and settings are being modified.
bool canMove = true |
Enables or disables movement.
bool canSearch = true |
Enables or disables searching for paths.
Setting this to false does not stop any active path requests from being calculated or stop it from continuing to follow the current path.
|
protected |
Only when the previous path has been returned should be search for a new path.
float endReachedDistance = 0.2F |
Distance to the end point to consider the end of path to be reached.
When the end is within this distance then OnTargetReached will be called and TargetReached will return true.
|
protected |
|
protected |
Time when the last path request was sent.
|
protected |
Current path which is followed.
float pickNextWaypointDist = 2 |
Determines within what range it will switch to target the next waypoint in the path.
float repathRate = 0.5F |
Determines how often it will search for new paths.
If you have fast moving targets or AIs, you might want to set it to a lower value. The value is in seconds between path requests.
float rotationSpeed = 360 |
Rotation speed.
Rotation is calculated using Quaternion.RotateTowards. This variable represents the rotation speed in degrees per second. The higher it is, the faster the character will be able to rotate.
float slowdownDistance = 0.6F |
Distance from the target point where the AI will start to slow down.
Note that this doesn't only affect the end point of the path but also any intermediate points, so be sure to set pickNextWaypointDist to a higher value than this
float speed = 3 |
Maximum velocity.
This is the maximum speed in world units per second.
|
private |
True if the Start function has been executed.
Used to test if coroutines should be started in OnEnable to prevent calculating paths in the awake stage (or rather before start on frame 0).
Transform target |
Target to move towards.
The AI will try to follow/move towards this target. It can be a point on the ground where the player has clicked in an RTS for example, or it can be the player object in a zombie game.
|
protected |
Point to where the AI is heading.
|
protected |
|
get |
Direction that the agent wants to move in (excluding physics and local avoidance).
|
getset |
True if the end of the path has been reached.
|
getset |
Rotation speed.