private static bool shouldStopCompletely(AutonomousAgent2D agent, ArriveSensor2D sensor) { var vel = agent.rigid.velocity; var sqStop = sensor.stopSpeed * sensor.stopSpeed; return(!vel.IsZero() && vel.sqrMagnitude < sqStop); }
public static Vector2 SteerForce(AutonomousAgent2D agent, ArriveSensor2D sensor) { Vector2 desired = sensor.target - (Vector2)agent.transform.position; float distanceToTarget = desired.magnitude; desired.Normalize(); // Stop completely. if (shouldStopSteering(distanceToTarget, sensor)) { if (shouldStopCompletely(agent, sensor)) { agent.rigid.velocity = Vector2.zero; } return(Vector2.zero); } // Slow down. else if (shouldSlowDown(distanceToTarget, sensor)) { float speed = agent.maxSpeed * (distanceToTarget / sensor.slowRadius); desired *= speed; } // Full speed. else { desired *= agent.maxSpeed; } return((desired - agent.rigid.velocity) * (1f / sensor.decelerationFactor)); }
protected void Awake() { if (path == null) { path = new Path2D(); } if (arriveSensor == null) { arriveSensor = new ArriveSensor2D(); } }
public static void DrawGizmos(AutonomousAgent2D agent, ArriveSensor2D sensor) { // Draw the slow radius DrawUtil.DrawCircle(agent.transform.position, sensor.slowRadius, Color.green); // Draw the stop radius DrawUtil.DrawCircle(agent.transform.position, sensor.stopRadius, Color.green); // Draw a line between the agent and its target. DrawUtil.DrawArrow(agent.transform.position, sensor.target, Color.green, 1f); // Draw the target position DrawUtil.DrawCircle(sensor.target, 0.15f, Color.green); }
private static bool shouldStopSteering(float distanceToTarget, ArriveSensor2D sensor) { return(distanceToTarget <= sensor.stopRadius); }
private static bool shouldSlowDown(float distanceToTarget, ArriveSensor2D sensor) { return(distanceToTarget <= sensor.slowRadius); }