public class PlayerMovement : MonoBehaviour
private float maximumSpeed;
private float rotationSpeed;
private float jumpButtonGracePeriod;
private Transform cameraTransform;
private Animator animator;
private CharacterController characterController;
private float originalStepOffset;
private float? lastGroundedTime;
private float? jumpButtonPressedTime;
animator = GetComponent<Animator>();
characterController = GetComponent<CharacterController>();
originalStepOffset = characterController.stepOffset;
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
Vector3 movementDirection = new Vector3(horizontalInput, 0, verticalInput);
float inputMagnitude = Mathf.Clamp01(movementDirection.magnitude);
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
animator.SetFloat("Input Magnitude", inputMagnitude, 0.05f, Time.deltaTime);
float speed = inputMagnitude * maximumSpeed;
movementDirection = Quaternion.AngleAxis(cameraTransform.rotation.eulerAngles.y, Vector3.up) * movementDirection;
movementDirection.Normalize();
ySpeed += Physics.gravity.y * Time.deltaTime;
if (characterController.isGrounded)
lastGroundedTime = Time.time;
if (Input.GetButtonDown("Jump"))
jumpButtonPressedTime = Time.time;
characterController.stepOffset = originalStepOffset;
if (Time.time - jumpButtonPressedTime <= jumpButtonGracePeriod)
jumpButtonPressedTime = null;
characterController.stepOffset = 0;
Vector3 velocity = movementDirection * speed;
characterController.Move(velocity * Time.deltaTime);
if (movementDirection != Vector3.zero)
Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
private void OnApplicationFocus(bool focus)
Cursor.lockState = CursorLockMode.Locked;
Cursor.lockState = CursorLockMode.None;
} if (Time.time - lastGroundedTime <= jumpButtonGracePeriod)
characterController.stepOffset = originalStepOffset;
if (Time.time - jumpButtonPressedTime <= jumpButtonGracePeriod)
jumpButtonPressedTime = null;
characterController.stepOffset = 0;
Vector3 velocity = movementDirection * speed;
characterController.Move(velocity * Time.deltaTime);
if (movementDirection != Vector3.zero)
Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
private void OnApplicationFocus(bool focus)
Cursor.lockState = CursorLockMode.Locked;
Cursor.lockState = CursorLockMode.None;