private float CalculateYMotion() { float _verticalAcceleration = _gravity; if (_stopJump && _velocity.y <= _minJumpVelocityThreshold && _velocity.y > 0) { _verticalAcceleration *= _stopJumpGravityMultiplier; } else if (_velocity.y <= 0) { _verticalAcceleration *= _fallGravityMultiplier; } float yMotion = PhysicsExt.CalculateMovementDistance(_velocity.y, _verticalAcceleration, Time.fixedDeltaTime); _velocity.y = PhysicsExt.CalculateVelocity(_velocity.y, _verticalAcceleration, Time.fixedDeltaTime); return(yMotion); }
private Vector3 CalculateXZMotion(float horizontalAxis, float verticalAxis) { Vector3 motion = new Vector3(horizontalAxis, 0, verticalAxis); motion.Normalize(); if (_charController.isGrounded) { motion *= _movementVelocity; _velocity.x = motion.x; _velocity.z = motion.z; motion *= Time.fixedDeltaTime; } else { if (horizontalAxis == 0 && verticalAxis == 0) { return(new Vector3(_velocity.x, 0, _velocity.z) * Time.fixedDeltaTime); } float xMotion = PhysicsExt.CalculateMovementDistance(_velocity.x, motion.x * _airControlAcceleration, Time.fixedDeltaTime); float zMotion = PhysicsExt.CalculateMovementDistance(_velocity.z, motion.z * _airControlAcceleration, Time.fixedDeltaTime); float normalizedMaxVelocity = Mathf.Max(Mathf.Abs(motion.x), Mathf.Abs(motion.z)) * _movementVelocity; float maxDistance = normalizedMaxVelocity * Time.fixedDeltaTime; xMotion = Mathf.Clamp(xMotion, -maxDistance, maxDistance); zMotion = Mathf.Clamp(zMotion, -maxDistance, maxDistance); _velocity.x = PhysicsExt.CalculateVelocity(_velocity.x, motion.x * _airControlAcceleration, Time.fixedDeltaTime); _velocity.z = PhysicsExt.CalculateVelocity(_velocity.z, motion.z * _airControlAcceleration, Time.fixedDeltaTime); _velocity.x = Mathf.Clamp(_velocity.x, -normalizedMaxVelocity, normalizedMaxVelocity); _velocity.z = Mathf.Clamp(_velocity.z, -normalizedMaxVelocity, normalizedMaxVelocity); motion.x = xMotion; motion.z = zMotion; } return(motion); }