private void UpdateFunction()
{
// We copy the actual velocity into a temporary variable that we can manipulate.
Vector3 velocity = movVelocity;
// Update velocity based on input
velocity = ApplyInputVelocityChange(velocity);
// Apply gravity and jumping force
velocity = ApplyGravityAndJumping (velocity);
// Save lastPosition for velocity calculation.
Vector3 lastPosition = tr.position;
// We always want the movement to be framerate independent. Multiplying by Time.deltaTime does this.
Vector3 currentMovementOffset = velocity * Time.deltaTime;
// Find out how much we need to push towards the ground to avoid loosing grouning
// when walking down a step or over a sharp change in slope.
float pushDownOffset = Mathf.Max(controller.stepOffset, new Vector3(currentMovementOffset.x, 0, currentMovementOffset.z).magnitude);
if (grounded)
currentMovementOffset -= pushDownOffset * Vector3.up;
// Reset variables that will be set by collision function
groundNormal = Vector3.zero;
// Move our character!
collisionFlags = controller.Move (currentMovementOffset);
lastHitPoint = hitPoint;
lastGroundNormal = groundNormal;
// Calculate the velocity based on the current and previous position.
// This means our velocity will only be the amount the character actually moved as a result of collisions.
Vector3 oldHVelocity = new Vector3(velocity.x, 0, velocity.z);
movVelocity = (tr.position - lastPosition) / Time.deltaTime;
Vector3 newHVelocity = new Vector3( movVelocity.x, 0, movVelocity.z);
// The CharacterController can be moved in unwanted directions when colliding with things.
// We want to prevent this from influencing the recorded velocity.
if (oldHVelocity == Vector3.zero)
{
movVelocity = new Vector3(0, movVelocity.y, 0);
}
else
{
float projectedNewVelocity = Vector3.Dot(newHVelocity, oldHVelocity) / oldHVelocity.sqrMagnitude;
movVelocity = oldHVelocity * Mathf.Clamp01(projectedNewVelocity) + movVelocity.y * Vector3.up;
}
if ( movVelocity.y < velocity.y - 0.001)
{
if ( movVelocity.y < 0)
{
// Something is forcing the CharacterController down faster than it should.
// Ignore this
movVelocity.y = velocity.y;
}
else
{
// The upwards movement of the CharacterController has been blocked.
// This is treated like a ceiling collision - stop further jumping here.
jumping.holdingJumpButton = false;
}
}
// We were grounded but just loosed grounding
if (grounded && !IsGroundedTest())
{
grounded = false;
SendMessage("OnFall", SendMessageOptions.DontRequireReceiver);
// We pushed the character down to ensure it would stay on the ground if there was any.
// But there wasn't so now we cancel the downwards offset to make the fall smoother.
tr.position += pushDownOffset * Vector3.up;
}
// We were not grounded but just landed on something
else if (!grounded && IsGroundedTest())
{
grounded = true;
jumping.jumping = false;
//SubtractNewPlatformVelocity();
SendMessage("OnLand", SendMessageOptions.DontRequireReceiver);
}
}