private void FixedUpdate() { if (raycastController.collisions.above || raycastController.collisions.below) { velocity -= Vector3.Dot(gravity.normalized, velocity) * gravity.normalized; } //Apply gravity velocity += gravity * Time.deltaTime; //Apply horizontal velocity with smoothing Vector3 verticalVelocity = gravity.normalized * Vector3.Dot(gravity.normalized, velocity); Vector3 currentHorizontalVelocity = velocity - verticalVelocity; velocity = Vector3.SmoothDamp(currentHorizontalVelocity, inputVelocity, ref velocitySmoothStorage, horizontalVelocitySmoothing, maxSpeed) + verticalVelocity; raycastController.ApplyCollisions(ref velocity, gravity); transform.Translate(velocity, Space.World); velocity = gravity.normalized * Vector3.Dot(gravity.normalized, velocity); //Maintain falling velocity }