public override MovementOutput GetMovement() { output.Clear(); characterPosition = Character.Position; foreach (DynamicCharacter dynamicCharacter in flock) { boid = dynamicCharacter.KinematicData; direction = characterPosition - boid.Position; distance = direction.sqrMagnitude; if (distance < Radius * Radius) { separationStrength = Mathf.Min(SeparationFactor / (distance), MaxAcceleration); direction.Normalize(); output.linear += direction * separationStrength; } } if (output.linear.sqrMagnitude > MaxAcceleration * MaxAcceleration) { output.linear.Normalize(); output.linear *= MaxAcceleration; } return(output); }
public override MovementOutput GetMovement() { Vector3 deltaPos = this.Target.Position - this.Character.Position; Vector3 deltaVel = this.Target.velocity - this.Character.velocity; float deltaSqrSpeed = deltaVel.sqrMagnitude; MovementOutput output = new MovementOutput(); output.Clear(); if (deltaSqrSpeed == 0) { return(output); } float timeToClosest = Mathf.Abs(-Vector3.Dot(deltaPos, deltaVel) / deltaSqrSpeed); if (timeToClosest > this.MaxTimeLookAhead) { return(output); } Vector3 futureDeltaPos = deltaPos + deltaVel * timeToClosest; float futureDistance = futureDeltaPos.magnitude; if (futureDistance > 2 * AvoidMargin) { return(output); } if (futureDistance <= 0 || deltaPos.magnitude < 2 * AvoidMargin) { output.linear = Character.Position - Target.Position; } else { output.linear = -futureDeltaPos; } output.linear = output.linear.normalized * this.MaxAcceleration; return(output); }
public override MovementOutput GetMovement() { output.Clear(); deltaPos = Target.Position - Character.Position; deltaVel = Target.velocity - Character.velocity; deltaSpeed = deltaVel.sqrMagnitude; if (deltaSpeed == 0) { return(output); } timeToClosest = (-Vector3.Dot(deltaPos, deltaVel)) / (deltaSpeed); if (timeToClosest > maxTimeLookAhead) { return(output); } futureDeltaPos = deltaPos + deltaVel * timeToClosest; futureDistance = futureDeltaPos.sqrMagnitude; if (futureDistance > twiceCollisionRadius * twiceCollisionRadius) { return(output); } if (futureDistance <= 0 || deltaPos.sqrMagnitude < twiceCollisionRadius * twiceCollisionRadius) { output.linear = Character.Position - Target.Position; } else { output.linear = futureDeltaPos * -1; } output.linear = output.linear.normalized * maxAcceleration; return(output); }
public override MovementOutput GetMovement() { Vector3 rayVector = Character.velocity.normalized; if (rayVector.magnitude == 0) { rayVector = Util.MathHelper.ConvertOrientationToVector(Character.rotation); } Debug.DrawRay(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle) * WhiskerLength, Color.black); Debug.DrawRay(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, WhiskerAngle) * WhiskerLength, Color.black); Debug.DrawRay(this.Character.Position, rayVector * MaxLookAhead, Color.black); RaycastHit collision; if (CollisionDetector.Raycast(new Ray(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle)), out collision, WhiskerLength)) { base.Target.Position = this.Character.Position + Util.MathHelper.Rotate2D(rayVector, WhiskerAngle) * AvoidMargin; return(base.GetMovement()); } if (CollisionDetector.Raycast(new Ray(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, WhiskerAngle)), out collision, WhiskerLength)) { base.Target.Position = this.Character.Position + Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle) * AvoidMargin; return(base.GetMovement()); } if (CollisionDetector.Raycast(new Ray(this.Character.Position, rayVector), out collision, MaxLookAhead)) { base.Target.Position = collision.point + collision.normal * AvoidMargin; return(base.GetMovement()); } MovementOutput output = new MovementOutput(); output.Clear(); return(output); }