A* Pathfinding Project
4.1.9
The A* Pathfinding Project for Unity 3D
|
Internal agent for the RVO system. More...
Internal agent for the RVO system.
Usually you will interface with the IAgent interface instead.
Classes | |
struct | VO |
Velocity Obstacle. More... | |
class | VOBuffer |
Very simple list. More... | |
Public Member Functions | |
Agent (Vector2 pos, float elevationCoordinate) | |
void | BufferSwitch () |
Reads public properties and stores them in internal fields. More... | |
void | CalculateNeighbours () |
Populate the neighbours and neighbourDists lists with the closest agents to this agent. More... | |
void | ForceSetVelocity (Vector2 velocity) |
Set the current velocity of the agent. More... | |
void | PostCalculation () |
void | PreCalculation () |
void | SetCollisionNormal (Vector2 normal) |
Set the normal of a wall (or something else) the agent is currently colliding with. More... | |
void | SetTarget (Vector2 targetPoint, float desiredSpeed, float maxSpeed) |
Point towards which the agent should move. More... | |
Package Functions | |
void | CalculateVelocity (Pathfinding.RVO.Simulator.WorkerContext context) |
float | InsertAgentNeighbour (Agent agent, float rangeSq) |
Used by the Quadtree. More... | |
Package Attributes | |
bool | locked = false |
Agent | next |
Used internally for a linked list. More... | |
Vector2 | position |
float | radius |
Simulator | simulator |
Simulator which handles this agent. More... | |
Properties | |
float | AgentTimeHorizon [get, set] |
Max number of estimated seconds to look into the future for collisions with agents. More... | |
float | CalculatedSpeed [get, private set] |
Optimal speed of the agent to avoid collisions. More... | |
Vector2 | CalculatedTargetPoint [get, private set] |
Optimal point to move towards to avoid collisions. More... | |
RVOLayer | CollidesWith [get, set] |
Layer mask specifying which layers this agent will avoid. More... | |
bool | DebugDraw [get, set] |
Draw debug information. More... | |
float | ElevationCoordinate [get, set] |
Coordinate which separates characters in the height direction. More... | |
float | Height [get, set] |
Height of the agent in world units. More... | |
RVOLayer | Layer [get, set] |
Specifies the avoidance layer for this agent. More... | |
bool | Locked [get, set] |
Locked agents will be assumed not to move. More... | |
int | MaxNeighbours [get, set] |
Max number of agents to take into account. More... | |
int | NeighbourCount [get, private set] |
Number of neighbours that the agent took into account during the last simulation step. More... | |
List< ObstacleVertex > | NeighbourObstacles [get] |
float | ObstacleTimeHorizon [get, set] |
Max number of estimated seconds to look into the future for collisions with obstacles. More... | |
Vector2 | Position [get, set] |
Position of the agent. More... | |
System.Action | PreCalculationCallback [set, private get] |
Callback which will be called right before avoidance calculations are started. More... | |
float | Priority [get, set] |
How strongly other agents will avoid this agent. More... | |
float | Radius [get, set] |
Radius of the agent in world units. More... | |
Properties inherited from IAgent | |
float | AgentTimeHorizon [get, set] |
Max number of estimated seconds to look into the future for collisions with agents. More... | |
float | CalculatedSpeed [get] |
Optimal speed of the agent to avoid collisions. More... | |
Vector2 | CalculatedTargetPoint [get] |
Optimal point to move towards to avoid collisions. More... | |
RVOLayer | CollidesWith [get, set] |
Layer mask specifying which layers this agent will avoid. More... | |
bool | DebugDraw [get, set] |
Draw debug information. More... | |
float | ElevationCoordinate [get, set] |
Coordinate which separates characters in the height direction. More... | |
float | Height [get, set] |
Height of the agent in world units. More... | |
RVOLayer | Layer [get, set] |
Specifies the avoidance layer for this agent. More... | |
bool | Locked [get, set] |
Locked agents will be assumed not to move. More... | |
int | MaxNeighbours [get, set] |
Max number of agents to take into account. More... | |
int | NeighbourCount [get] |
Number of neighbours that the agent took into account during the last simulation step. More... | |
List< ObstacleVertex > | NeighbourObstacles [get] |
List of obstacle segments which were close to the agent during the last simulation step. More... | |
float | ObstacleTimeHorizon [get, set] |
Max number of estimated seconds to look into the future for collisions with obstacles. More... | |
Vector2 | Position [get, set] |
Position of the agent. More... | |
System.Action | PreCalculationCallback [set] |
Callback which will be called right before avoidance calculations are started. More... | |
float | Priority [get, set] |
How strongly other agents will avoid this agent. More... | |
float | Radius [get, set] |
Radius of the agent in world units. More... | |
Private Member Functions | |
Vector2 | EvaluateGradient (VOBuffer vos, Vector2 p, out float value) |
Evaluate gradient and value of the cost function at velocity p. More... | |
void | GenerateNeighbourAgentVOs (VOBuffer vos) |
void | GenerateObstacleVOs (VOBuffer vos) |
Vector2 | GradientDescent (VOBuffer vos, Vector2 sampleAround1, Vector2 sampleAround2) |
Vector2 | To2D (Vector3 p, out float elevation) |
Converts a 3D vector to a 2D vector in the movement plane. More... | |
Vector2 | Trace (VOBuffer vos, Vector2 p, out float score) |
Traces the vector field constructed out of the velocity obstacles. More... | |
Static Private Member Functions | |
static bool | BiasDesiredVelocity (VOBuffer vos, ref Vector2 desiredVelocity, ref Vector2 targetPointInVelocitySpace, float maxBiasRadians) |
Bias towards the right side of agents. More... | |
static void | DrawVO (Vector2 circleCenter, float radius, Vector2 origin) |
static Vector3 | FromXZ (Vector2 p) |
(x, 0, y) More... | |
static Color | Rainbow (float v) |
static float | Sqr (float x) |
Square a number. More... | |
static Vector2 | ToXZ (Vector3 p) |
(x, z) More... | |
Private Attributes | |
float | agentTimeHorizon |
float | calculatedSpeed |
Vector2 | calculatedTargetPoint |
RVOLayer | collidesWith |
Vector2 | collisionNormal |
Vector2 | currentVelocity |
bool | debugDraw |
float | desiredSpeed |
Vector2 | desiredTargetPointInVelocitySpace |
Desired target point - position. More... | |
Vector2 | desiredVelocity |
const float | DesiredVelocityWeight = 0.1f |
float | elevationCoordinate |
float | height |
RVOLayer | layer |
bool | manuallyControlled |
int | maxNeighbours |
float | maxSpeed |
List< float > | neighbourDists = new List<float>() |
List< Agent > | neighbours = new List<Agent>() |
float | nextDesiredSpeed |
float | nextMaxSpeed |
Vector2 | nextTargetPoint |
List< ObstacleVertex > | obstacles = new List<ObstacleVertex>() |
List< ObstacleVertex > | obstaclesBuffered = new List<ObstacleVertex>() |
float | obstacleTimeHorizon |
const float | WallWeight = 5 |
Extra weight that walls will have. More... | |
Agent | ( | Vector2 | pos, |
float | elevationCoordinate | ||
) |
|
staticprivate |
Bias towards the right side of agents.
Rotate desiredVelocity at most [value] number of radians. 1 radian ≈ 57° This breaks up symmetries.
The desired velocity will only be rotated if it is inside a velocity obstacle (VO). If it is inside one, it will not be rotated further than to the edge of it
The targetPointInVelocitySpace will be rotated by the same amount as the desired velocity
void BufferSwitch | ( | ) |
Reads public properties and stores them in internal fields.
This is required because multithreading is used and if another script updated the fields at the same time as this class used them in another thread weird things could happen.
Will also set CalculatedTargetPoint and CalculatedSpeed to the result which was last calculated.
void CalculateNeighbours | ( | ) |
Populate the neighbours and neighbourDists lists with the closest agents to this agent.
|
package |
|
staticprivate |
|
private |
Evaluate gradient and value of the cost function at velocity p.
void ForceSetVelocity | ( | Vector2 | velocity | ) |
Set the current velocity of the agent.
This will override the local avoidance input completely. It is useful if you have a player controlled character and want other agents to avoid it.
Calling this method will mark the agent as being externally controlled for 1 simulation step. Local avoidance calculations will be skipped for the next simulation step but will be resumed after that unless this method is called again.
Implements IAgent.
|
staticprivate |
(x, 0, y)
|
private |
|
private |
|
private |
|
package |
Used by the Quadtree.
void PostCalculation | ( | ) |
void PreCalculation | ( | ) |
|
staticprivate |
void SetCollisionNormal | ( | Vector2 | normal | ) |
Set the normal of a wall (or something else) the agent is currently colliding with.
This is used to make the RVO system aware of things like physics or an agent being clamped to the navmesh. The velocity of this agent that other agents observe will be modified so that there is no component into the wall. The agent will however not start to avoid the wall, for that you will need to add RVO obstacles.
This value will be cleared after the next simulation step, normally it should be set every frame when the collision is still happening.
Implements IAgent.
void SetTarget | ( | Vector2 | targetPoint, |
float | desiredSpeed, | ||
float | maxSpeed | ||
) |
Point towards which the agent should move.
Usually you set this once per frame. The agent will try move as close to the target point as possible. Will take effect at the next simulation step.
targetPoint | Target point in world space (XZ plane or XY plane depending on if the simulation is configured for 2D or 3D). Note that this is a Vector2, not a Vector3 since the system simulates everything internally in 2D. So if your agents move in the XZ plane you will have to supply it as a Vector2 with (x,z) coordinates. |
desiredSpeed | Desired speed of the agent. In world units per second. The agent will try to move with this speed if possible. |
maxSpeed | Max speed of the agent. In world units per second. If necessary (for example if another agent is on a collision trajectory towards this agent) the agent can move at this speed. Should be at least as high as desiredSpeed, but it is recommended to use a slightly higher value than desiredSpeed (for example desiredSpeed*1.2). |
Implements IAgent.
|
staticprivate |
Square a number.
|
private |
Converts a 3D vector to a 2D vector in the movement plane.
If movementPlane is XZ it will be projected onto the XZ plane and the elevation coordinate will be the Y coordinate otherwise it will be projected onto the XY plane and elevation will be the Z coordinate.
|
staticprivate |
(x, z)
|
private |
Traces the vector field constructed out of the velocity obstacles.
Returns the position which gives the minimum score (approximately).
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
Desired target point - position.
|
private |
|
private |
|
private |
|
private |
|
private |
|
package |
|
private |
|
private |
|
private |
|
private |
|
package |
Used internally for a linked list.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
package |
|
package |
|
package |
Simulator which handles this agent.
Used by this script as a reference and to prevent adding this agent to multiple simulations.
|
private |
Extra weight that walls will have.
|
getset |
Max number of estimated seconds to look into the future for collisions with agents.
As it turns out, this variable is also very good for controling agent avoidance priorities. Agents with lower values will avoid other agents less and thus you can make 'high priority agents' by giving them a lower value.
|
getprivate set |
Optimal speed of the agent to avoid collisions.
The movement script should move towards CalculatedTargetPoint with this speed.
|
getprivate set |
Optimal point to move towards to avoid collisions.
The movement script should move towards this point with a speed of CalculatedSpeed.
|
getset |
Layer mask specifying which layers this agent will avoid.
You can set it as CollidesWith = RVOLayer.DefaultAgent | RVOLayer.Layer3 | RVOLayer.Layer6 ...
|
getset |
Draw debug information.
|
getset |
Coordinate which separates characters in the height direction.
Since RVO can be used either in 2D or 3D, it is not as simple as just using the y coordinate of the 3D position. In 3D this will most likely be set to the y coordinate, but in 2D (top down) it should in most cases be set to 0 since all characters are always in the same plane, however it may be set to some other value, for example if the game is 2D isometric.
The position is assumed to be at the base of the character (near the feet).
|
getset |
Height of the agent in world units.
Agents are modelled as circles/cylinders.
|
getset |
Specifies the avoidance layer for this agent.
The CollidesWith mask on other agents will determine if they will avoid this agent.
|
getset |
Locked agents will be assumed not to move.
|
getset |
Max number of agents to take into account.
Decreasing this value can lead to better performance, increasing it can lead to better quality of the simulation.
|
getprivate set |
Number of neighbours that the agent took into account during the last simulation step.
|
get |
|
getset |
Max number of estimated seconds to look into the future for collisions with obstacles.
|
getset |
Position of the agent.
The agent does not move by itself, a movement script has to be responsible for reading the CalculatedTargetPoint and CalculatedSpeed properties and move towards that point with that speed. This property should ideally be set every frame.
Note that this is a Vector2, not a Vector3 since the RVO simulates everything internally in 2D. So if your agents move in the XZ plane you may have to convert it to a Vector3 like this.
|
setprivate get |
Callback which will be called right before avoidance calculations are started.
Used to update the other properties with the most up to date values
|
getset |
How strongly other agents will avoid this agent.
Usually a value between 0 and 1. Agents with similar priorities will avoid each other with an equal strength. If an agent sees another agent with a higher priority than itself it will avoid that agent more strongly. In the extreme case (e.g this agent has a priority of 0 and the other agent has a priority of 1) it will treat the other agent as being a moving obstacle. Similarly if an agent sees another agent with a lower priority than itself it will avoid that agent less.
In general the avoidance strength for this agent is:
|
getset |
Radius of the agent in world units.
Agents are modelled as circles/cylinders.