A* Pathfinding Project
4.1.2
The A* Pathfinding Project for Unity 3D
|
Linearly interpolating movement script. More...
Linearly interpolating movement script.
This movement script will follow the path exactly, it uses linear interpolation to move between the waypoints in the path. This is desirable for some types of games. It also works in 2D.
This depends on what type of movement you are aiming for. If you are aiming for movement where the unit follows the path exactly and move only along the graph connections on a grid/point graph. I recommend that you adjust the StartEndModifier on the Seeker component: set the 'Start Point Snapping' field to 'NodeConnection' and the 'End Point Snapping' field to 'SnapToNode'.
If you on the other hand want smoother movement I recommend setting 'Start Point Snapping' and 'End Point Snapping' to 'ClosestOnNode' and to add the Simple Smooth Modifier to the GameObject as well. Alternatively you can use the Funnel Modifier which works better on navmesh/recast graphs or the RaycastModifier.
You should not combine the Simple Smooth Modifier or the Funnel Modifier with the NodeConnection snapping mode. This may lead to very odd behavior.
You may also want to tweak the rotationSpeed.Public Member Functions | |
void | FinalizeMovement (Vector3 nextPosition, Quaternion nextRotation) |
Move the agent. | |
virtual void | ForceSearchPath () |
Requests a path to the target. | |
virtual Vector3 | GetFeetPosition () |
void | MovementUpdate (float deltaTime, out Vector3 nextPosition, out Quaternion nextRotation) |
Calculate how the character wants to move during this frame. | |
void | OnDisable () |
virtual void | OnPathComplete (Path _p) |
Called when a requested path has finished calculation. | |
virtual void | OnTargetReached () |
The end of the path has been reached. | |
virtual void | SearchPath () |
Requests a path to the target. | |
void | Teleport (Vector3 position, bool clearPath) |
float | TrySearchPath () |
Tries to search for a path. | |
Public Member Functions inherited from IAstarAI | |
void | FinalizeMovement (Vector3 nextPosition, Quaternion nextRotation) |
Move the agent. | |
void | Move (Vector3 deltaPosition) |
Move the agent. | |
void | MovementUpdate (float deltaTime, out Vector3 nextPosition, out Quaternion nextRotation) |
Calculate how the character wants to move during this frame. | |
void | SearchPath () |
Recalculate the current path. | |
void | Teleport (Vector3 newPosition, bool clearPath=true) |
Instantly move the agent to a new position. | |
Public Attributes | |
bool | canMove = true |
Enables or disables movement completely. | |
bool | canSearch = true |
Enables or disables recalculating the path at regular intervals. | |
bool | enableRotation = true |
If true, the AI will rotate to face the movement direction. | |
bool | interpolatePathSwitches = true |
If true, some interpolation will be done when a new path has been calculated. | |
float | repathRate = 0.5F |
Determines how often it will search for new paths. | |
bool | rotationIn2D = false |
If true, rotation will only be done along the Z axis so that the Y axis is the forward direction of the character. | |
float | rotationSpeed = 10 |
How quickly to rotate. | |
float | speed = 3 |
Speed in world units. | |
float | switchPathInterpolationSpeed = 5 |
How quickly to interpolate to the new path. | |
bool | updatePosition = true |
Determines if the character's position should be coupled to the Transform's position. | |
bool | updateRotation = true |
Determines if the character's rotation should be coupled to the Transform's rotation. | |
Protected Member Functions | |
override void | Awake () |
Initializes reference variables. | |
virtual Vector3 | CalculateNextPosition (out Vector3 direction, float deltaTime) |
Calculate the AI's next position (one frame in the future). | |
virtual void | ConfigureNewPath () |
Finds the closest point on the current path and configures the interpolator. | |
virtual void | ConfigurePathSwitchInterpolation () |
virtual void | OnEnable () |
Called when the component is enabled. | |
override int | OnUpgradeSerializedData (int version, bool unityThread) |
Handle serialization backwards compatibility. | |
IEnumerator | RepeatTrySearchPath () |
Tries to search for a path every repathRate seconds. | |
virtual void | Start () |
Starts searching for paths. | |
virtual void | Update () |
Protected Attributes | |
bool | canSearchAgain = true |
Only when the previous path has been returned should a search for a new path be done. | |
PathInterpolator | interpolator = new PathInterpolator() |
float | lastRepath = -9999 |
Time when the last path request was sent. | |
ABPath | path |
Current path which is followed. | |
float | pathSwitchInterpolationTime = 0 |
Time since the path was replaced by a new path. | |
Vector3 | previousMovementDirection |
Vector3 | previousMovementOrigin |
When a new path was returned, the AI was moving along this ray. | |
Seeker | seeker |
Cached Seeker component. | |
Transform | tr |
Cached Transform component. | |
Properties | |
bool IAstarAI. | canMove [get, set] |
Enables or disables movement completely. | |
bool IAstarAI. | canSearch [get, set] |
Enables or disables recalculating the path at regular intervals. | |
Vector3 IAstarAI. | desiredVelocity [get] |
Vector3 | destination [get, set] |
bool | hasPath [get] |
bool | isStopped [get, set] |
Gets or sets if the agent should stop moving. | |
float IAstarAI. | maxSpeed [get, set] |
Max speed in world units per second. | |
System.Action | onSearchPath [get, set] |
Called when the agent recalculates its path. | |
bool | pathPending [get] |
Vector3 | position [get] |
Position of the agent. | |
float | remainingDistance [get, set] |
Quaternion | rotation [get] |
Rotation of the agent. | |
virtual bool | shouldRecalculatePath [get] |
True if the path should be automatically recalculated as soon as possible. | |
Vector3 IAstarAI. | steeringTarget [get] |
Point on the path which the agent is currently moving towards. | |
Transform | target [get, set] |
Target to move towards. | |
bool | targetReached [get, set] |
True if the end of the current path has been reached. | |
Vector3 IAstarAI. | velocity [get] |
Properties inherited from IAstarAI | |
bool | canMove [get, set] |
Enables or disables movement completely. | |
bool | canSearch [get, set] |
Enables or disables recalculating the path at regular intervals. | |
Vector3 | desiredVelocity [get] |
Velocity that this agent wants to move with. | |
Vector3 | destination [get, set] |
Position in the world that this agent should move to. | |
bool | hasPath [get] |
True if this agent currently has a path that it follows. | |
bool | isStopped [get, set] |
Gets or sets if the agent should stop moving. | |
float | maxSpeed [get, set] |
Max speed in world units per second. | |
System.Action | onSearchPath [get, set] |
Called when the agent recalculates its path. | |
bool | pathPending [get] |
True if a path is currently being calculated. | |
Vector3 | position [get] |
Position of the agent. | |
float | remainingDistance [get] |
Remaining distance along the current path to the end of the path. | |
Quaternion | rotation [get] |
Rotation of the agent. | |
Vector3 | steeringTarget [get] |
Point on the path which the agent is currently moving towards. | |
bool | targetReached [get] |
True if the agent has reached the end of the current path. | |
Vector3 | velocity [get] |
Actual velocity that the agent is moving with. | |
Private Member Functions | |
void | Init () |
void IAstarAI. | Move (Vector3 deltaPosition) |
Move the agent. | |
Quaternion | SimulateRotationTowards (Vector3 direction, float deltaTime) |
Private Attributes | |
Vector3 | previousPosition1 |
Vector3 | previousPosition2 |
Vector3 | simulatedPosition |
Quaternion | simulatedRotation |
bool | startHasRun = false |
Holds if the Start function has been run. | |
Transform | targetCompatibility |
Required for serialization backward compatibility. | |
|
protectedvirtual |
Initializes reference variables.
If you override this function you should in most cases call base.Awake () at the start of it.
Reimplemented from VersionedMonoBehaviour.
|
protectedvirtual |
Calculate the AI's next position (one frame in the future).
direction | The tangent of the segment the AI is currently traversing. Not normalized. |
|
protectedvirtual |
Finds the closest point on the current path and configures the interpolator.
|
protectedvirtual |
void FinalizeMovement | ( | Vector3 | nextPosition, |
Quaternion | nextRotation | ||
) |
Move the agent.
To be called as the last step when you are handling movement manually.The movement will be clamped to the navmesh if applicable (this is done for the RichAI movement script).
|
virtual |
Requests a path to the target.
Bypasses 'is-it-a-good-time-to-request-a-path' checks.
|
virtual |
|
private |
|
private |
Move the agent.
deltaPosition | Direction and distance to move the agent in world space. |
This is intended for external movement forces such as those applied by wind, conveyor belts, knockbacks etc.Some movement scripts may ignore this completely (notably the AILerp script) if it does not have any concept of being moved externally.The agent will not be moved immediately when calling this method. Instead this offset will be stored and then applied the next time the agent runs its movement calculations (which is usually later this frame or the next frame). If you want to move the agent immediately then call:
void MovementUpdate | ( | float | deltaTime, |
out Vector3 | nextPosition, | ||
out Quaternion | nextRotation | ||
) |
Calculate how the character wants to move during this frame.
deltaTime | time to simulate movement for. Usually set to Time.deltaTime. |
nextPosition | the position that the agent wants to move to during this frame. |
nextRotation | the rotation that the agent wants to rotate to during this frame. |
Note that this does not actually move the character. You need to call FinalizeMovement for that. This is called automatically unless canMove is false.To handle movement yourself you can disable canMove and call this method manually. This code will replicate the normal behavior of the component:
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.
|
virtual |
The end of the path has been reached.
If you want custom logic for when the AI has reached it's destination add it here. You can also create a new script which inherits from this one and override the function in that script.
|
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.
|
private |
|
protectedvirtual |
Starts searching for paths.
If you override this function you should in most cases call base.Start () at the start of it.
void Teleport | ( | Vector3 | position, |
bool | clearPath | ||
) |
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.
|
protectedvirtual |
bool canMove = true |
bool canSearch = true |
Enables or disables recalculating the path at regular intervals.
Setting this to false does not stop any active path requests from being calculated or stop it from continuing to follow the current path.Note that this only disables automatic path recalculations. If you call the SearchPath() method a path will still be calculated.
|
protected |
Only when the previous path has been returned should a search for a new path be done.
bool enableRotation = true |
If true, the AI will rotate to face the movement direction.
bool interpolatePathSwitches = true |
If true, some interpolation will be done when a new path has been calculated.
This is used to avoid short distance teleportation.
|
protected |
|
protected |
Time when the last path request was sent.
|
protected |
Current path which is followed.
|
protected |
Time since the path was replaced by a new path.
|
protected |
|
protected |
When a new path was returned, the AI was moving along this ray.
Used to smoothly interpolate between the previous movement and the movement along the new path. The speed is equal to movement direction.
|
private |
|
private |
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.
bool rotationIn2D = false |
If true, rotation will only be done along the Z axis so that the Y axis is the forward direction of the character.
This is useful for 2D games in which one often want to have the Y axis as the forward direction to get sprites and 2D colliders to work properly.
float rotationSpeed = 10 |
How quickly to rotate.
|
private |
|
private |
float speed = 3 |
Speed in world units.
|
private |
Holds if the Start function has been run.
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).
float switchPathInterpolationSpeed = 5 |
How quickly to interpolate to the new path.
|
private |
Required for serialization backward compatibility.
|
protected |
Cached Transform component.
bool updatePosition = true |
Determines if the character's position should be coupled to the Transform's position.
If false then all movement calculations will happen as usual, but the object that this component is attached to will not move instead only the position property will change.
bool updateRotation = true |
Determines if the character's rotation should be coupled to the Transform's rotation.
If false then all movement calculations will happen as usual, but the object that this component is attached to will not rotate instead only the rotation property will change.
|
getsetprivate |
|
getsetprivate |
Enables or disables recalculating the path at regular intervals.
Setting this to false does not stop any active path requests from being calculated or stop it from continuing to follow the current path.Note that this only disables automatic path recalculations. If you call the SearchPath() method a path will still be calculated.
|
getprivate |
|
getset |
|
get |
|
getset |
Gets or sets if the agent should stop moving.
If this is set to true the agent will immediately start to slow down as quickly as it can to come to a full stop. The agent will still react to local avoidance and gravity (if applicable), but it will not try to move in any particular direction.The current path of the agent will not be cleared, so when this is set to false again the agent will continue moving along the previous path.This is a purely user-controlled parameter, so for example it is not set automatically when the agent stops moving because it has reached the target. Use targetReached for that.If this property is set to true while the agent is traversing an off-mesh link (RichAI script only), then the agent will continue traversing the link and stop once it has completed it.
The steeringTarget property will continue to indicate the point which the agent would move towards if it would not be stopped.
|
getsetprivate |
Max speed in world units per second.
|
getset |
Called when the agent recalculates its path.
This is called both for automatic path recalculations (see canSearch) and manual ones (see SearchPath).
|
get |
|
get |
|
getset |
|
get |
|
getprotected |
True if the path should be automatically recalculated as soon as possible.
|
getprivate |
Point on the path which the agent is currently moving towards.
This is usually a point a small distance ahead of the agent or the end of the path.If the agent does not have a path at the moment, then the agent's current position will be returned.
|
getset |
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.
|
getset |
True if the end of the current path has been reached.
|
getprivate |