using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(CharacterController))] public class KbmController : MonoBehaviour { private PlayerActions _playerActions; public float walkingSpeed = 7.5f; public float jumpSpeed = 8.0f; public float gravity = 20.0f; public Camera playerCamera; public float lookSpeed = 2.0f; public float lookXLimit = 45.0f; CharacterController _characterController; Vector3 _moveDirection = Vector3.zero; float _rotationX = 0; [HideInInspector] public bool canMove = true; void Start() { _characterController = GetComponent(); // Lock cursor Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } private void OnEnable() { _playerActions = new PlayerActions(); _playerActions.Enable(); } void Update() { // We are grounded, so recalculate move direction based on axes Vector3 forward = transform.TransformDirection(Vector3.forward); Vector3 right = transform.TransformDirection(Vector3.right); Vector2 input = _playerActions.KBM.Move.ReadValue() * Time.deltaTime; float curSpeedX = canMove ? walkingSpeed * input.y : 0; float curSpeedY = canMove ? walkingSpeed * input.x : 0; float movementDirectionY = _moveDirection.y; _moveDirection = (forward * curSpeedX) + (right * curSpeedY); if (_playerActions.KBM.Jump.IsPressed() && canMove && _characterController.isGrounded) { _moveDirection.y = jumpSpeed; } else { _moveDirection.y = movementDirectionY; } // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied // as an acceleration (ms^-2) if (!_characterController.isGrounded) { _moveDirection.y -= gravity * Time.deltaTime; } // Move the controller _characterController.Move(_moveDirection * Time.deltaTime); // Player and Camera rotation if (canMove) { _rotationX += -_playerActions.KBM.Look.ReadValue().y * Time.deltaTime * lookSpeed; _rotationX = Mathf.Clamp(_rotationX, -lookXLimit, lookXLimit); playerCamera.transform.localRotation = Quaternion.Euler(_rotationX, 0, 0); transform.rotation *= Quaternion.Euler(0, _playerActions.KBM.Look.ReadValue().x * Time.deltaTime * lookSpeed, 0); } } }