Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class SteeringMovement
- {
- Vector3 _velocity;
- Vector3 _acceleration;
- Vector3 _position;
- public Vector3 Target;
- public float ArriveRadius = 3;
- public SteeringMovement(float maxSpeed = 15,float maxForce = 5)
- {
- MaxSpeed = maxSpeed;
- MaxForce = maxForce;
- }
- public float MaxForce { get; set; }
- public float MaxSpeed { get; set; }
- public void UpdateMovement(Transform owner)
- {
- _position = owner.position;
- ApplyForce(Arrive(Target,ArriveRadius));
- UpdateVehicle(Time.deltaTime);
- ApplyToTransform(owner);
- ClearForces();
- }
- void ApplyForce(Vector3 force) => _acceleration += force;
- void ClearForces() => _acceleration = Vector3.zero;
- void UpdateVehicle(float time)
- {
- _position += _velocity * time;
- _velocity += _acceleration;
- ClearForces();
- }
- public void ApplyToTransform(Transform owner)
- {
- owner.position = _position;
- if (_velocity.magnitude < 0.1f) return;
- var desiredRotation = Quaternion.LookRotation(_velocity);
- owner.rotation = Quaternion.Lerp(owner.rotation,desiredRotation,Time.deltaTime*12);
- }
- Vector3 Seek(Vector3 target)
- {
- var desired = target - _position;
- desired.Normalize();
- desired *= MaxSpeed;
- var steeringForce = desired - _velocity;
- return Vector3.ClampMagnitude(steeringForce,MaxForce);
- }
- Vector3 Arrive(Vector3 target,float radius)
- {
- var desired = target - _position;
- var distance = desired.magnitude;
- desired.Normalize();
- var speed = MaxSpeed;
- if (distance < radius)
- speed = map(distance, 0, radius, 0, MaxSpeed);
- desired *= speed;
- var steeringForce = desired - _velocity;
- return Vector3.ClampMagnitude(steeringForce,MaxForce);
- }
- float map(float val, float a1, float a2, float b1, float b2) =>
- b1 + (val-a1)*(b2-b1)/(a2-a1);
- }
Add Comment
Please, Sign In to add comment