What do I do wrong with this? Sometimes the rigid body shots away at too high of velocity. i have got up to 18-19 in velocity even when my max is 10.
Think I missed some error in this match. There is some debug code in this as well to look at the numbers and all seems right all but the velocity. maby there is one thing sometimes the speedDiffFract gets negative is should be always between 0-1.0f.
public float maxSpeed = 5f;
public Vector3 inputDirection;
public float acceleration = 20f;
public float maxSlope = 40f;
public float airDamp = 0.1f;
public float currentSpeed;
public bool grounded = false;
private float mass;
public Vector3 velocity;
public Vector3 upVector;
public Vector3 correctedAddForce;
private float massAcceleration;
public float speedDiffFract;
public float forceDot;
public Vector3 modifiedForce;
public Vector3 correctedForce;
// temp data
public float maxModForce = 0f;
public float minModForce = 0f;
public float minVelocity = 0f;
public float maxVelocity = 0f;
public float maxWantAdd = 0f;
public float minWantAdd = 0f;
public float maxCorrectForce = 0f;
public float minCorrectForce = 0f;
public float maxDiffFract = 0f;
public float minDiffFract = 0f;
public float maxDot = 0f;
public float minDot = 0f;
void Update () {
mass = rigidbody.mass;
massAcceleration = mass*acceleration;
inputDirection.Set (Input.GetAxis("Horizontal"),0, Input.GetAxis("Vertical"));
inputDirection = inputDirection.normalized;
inputDirection *= massAcceleration;
if (inputDirection.magnitude < minWantAdd)
minWantAdd = inputDirection.magnitude;
if (inputDirection.magnitude > maxWantAdd)
maxWantAdd = inputDirection.magnitude;
velocity = rigidbody.velocity;
velocity.y = 0f;
currentSpeed = velocity.magnitude;
if(velocity.magnitude < minVelocity)
minVelocity = velocity.magnitude;
if(velocity.magnitude > maxVelocity)
maxVelocity = velocity.magnitude;
speedDiffFract = 1.0f-(velocity.magnitude/maxSpeed);
if(speedDiffFract < minDiffFract)
minDiffFract = speedDiffFract;
if(speedDiffFract > maxDiffFract)
maxDiffFract = speedDiffFract;
forceDot = Vector3.Dot (velocity.normalized,inputDirection.normalized);
if(forceDot < minDot)
minDot = forceDot;
if(forceDot > maxDot)
maxDot = forceDot;
modifiedForce = inputDirection*speedDiffFract;
if(modifiedForce.magnitude < minModForce)
minModForce = modifiedForce.magnitude;
if(modifiedForce.magnitude > maxModForce)
maxModForce = modifiedForce.magnitude;
correctedForce = Vector3.Lerp(inputDirection,modifiedForce,forceDot);
if(correctedForce.magnitude < minCorrectForce)
minCorrectForce = correctedForce.magnitude;
if(correctedForce.magnitude > maxCorrectForce)
maxCorrectForce = correctedForce.magnitude;
rigidbody.AddRelativeForce(correctedForce);
}