// Update is called once per frame void Update() { // Get the input vector from keyboard or analog stick Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal"), Mathf.Abs(Input.GetAxis("Vertical")), 0); Vector3 inputVector = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0); if (powerUps.HasPowerUp(PowerUp.Rush)) { motor.movement.maxForwardSpeed = 20; } else { motor.movement.maxForwardSpeed = 10; //TODO: use value from inspector instead of hardcoded } motor.movement.canClimb = powerUps.HasPowerUp(PowerUp.Climb); if (directionVector != Vector3.zero) { // Get the length of the directon vector and then normalize it // Dividing by the length is cheaper than normalizing when we already have the length anyway var directionLength = directionVector.magnitude; directionVector = directionVector / directionLength; // Make sure the length is no bigger than 1 directionLength = Mathf.Min(1, directionLength); // Make the input vector more sensitive towards the extremes and less sensitive in the middle // This makes it easier to control slow speeds when using analog sticks directionLength = directionLength * directionLength; // Multiply the normalized direction vector by the modified length directionVector = directionVector * directionLength; } // Rotate the input vector into camera space so up is camera's up and right is camera's right directionVector = Camera.main.transform.rotation * directionVector; // Rotate input vector to be perpendicular to character's up vector Quaternion camToCharacterSpace = Quaternion.FromToRotation(-Camera.main.transform.forward, transform.up); directionVector = (camToCharacterSpace * directionVector); // Apply the direction to the CharacterMotor motor.inputMoveDirection = inputVector; motor.inputJump = Input.GetButton("Jump"); Vector3 newForward = ConstantSlerp(transform.forward, directionVector, maxRotationSpeed * Time.deltaTime); newForward = ProjectOntoPlane(newForward, transform.up); transform.rotation = Quaternion.LookRotation(newForward, transform.up); // Reset to SpawnPoint if too low. if (motor.transform.position.y < lowestPoint.position.y && !respawnRunning) { StartCoroutine(Respawn()); } // Set Animation Variables SetAnimationVars(); }