using Unity.Netcode; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; public class RobotController : NetworkBehaviour { [Header("Objects")] [SerializeField] private CharacterController characterController; [SerializeField] protected Camera mainCam; [SerializeField] private float upDownRange = 90f; private float verticalRotation; [Header("Movement")] [SerializeField] private float walkSpeed = 5.0f; [SerializeField] private float sprintMultiplier = 5.0f; [Header("Gravity / JumpForce")] [SerializeField] private float gravity = 9.81f; [SerializeField] private float jumpForce = 5f; [Header("Look Sensitivity")] [SerializeField] private float m_lookSensitivity = 3.0f; private bool m_cursorIsLocked = true; [Header("Input Actions")] [SerializeField] private InputActionAsset playerControls; private InputAction moveAction; private InputAction lookAction; private InputAction attackAction; private InputAction interactAction; private InputAction crouchAction; private InputAction jumpAction; private InputAction previousAction; private InputAction nextAction; private InputAction sprintAction; private Vector2 moveInput; private Vector2 lookInput; private bool isMoving; private Vector3 currentMovement = Vector3.zero; private void Awake() { characterController = GetComponent(); moveAction = playerControls.FindActionMap("Player").FindAction("Move"); lookAction = playerControls.FindActionMap("Player").FindAction("Look"); sprintAction = playerControls.FindActionMap("Player").FindAction("Sprint"); jumpAction = playerControls.FindActionMap("Player").FindAction("Jump"); moveAction.performed += context => moveInput = context.ReadValue(); moveAction.canceled += context => moveInput = Vector2.zero; lookAction.performed += context => lookInput = context.ReadValue(); lookAction.canceled += context => lookInput = Vector2.zero; } private void OnEnable() { moveAction.Enable(); lookAction.Enable(); sprintAction.Enable(); jumpAction.Enable(); } private void OnDisable() { moveAction.Disable(); lookAction.Disable(); sprintAction.Disable(); jumpAction.Disable(); } private void Update() { if (!IsOwner) return; HandleMovement(); HandleRotation(); InternalLockUpdate(); } private void HandleMovement() { float speedMultiplier = sprintAction.ReadValue() > 0 ? sprintMultiplier : 1f; float verticalSpeed = moveInput.y * walkSpeed * speedMultiplier; float horizontalSpeed = moveInput.x * walkSpeed * speedMultiplier; Vector3 horizontalMovement = new Vector3 (horizontalSpeed, 0, verticalSpeed); horizontalMovement = transform.rotation * horizontalMovement; handleGravityAndJumping(); currentMovement.x = horizontalMovement.x; currentMovement.z = horizontalMovement.z; characterController.Move(currentMovement * Time.deltaTime); isMoving = moveInput.y != 0 || moveInput.x != 0; } private void handleGravityAndJumping() { if (characterController.isGrounded) { currentMovement.y = -0.5f; if (jumpAction.triggered) { currentMovement.y = jumpForce; } } else { currentMovement.y -= gravity * Time.deltaTime; } } void HandleRotation() { float mouseXRotation = lookInput.x * m_lookSensitivity; transform.Rotate(0, mouseXRotation, 0); verticalRotation -= lookInput.y * m_lookSensitivity; verticalRotation = Mathf.Clamp(verticalRotation, -upDownRange, upDownRange); mainCam.transform.localRotation = Quaternion.Euler(verticalRotation, 0, 0); } //controls the locking and unlocking of the mouse private void InternalLockUpdate() { if (Input.GetKeyUp(KeyCode.Escape)) { m_cursorIsLocked = false; } else if (Input.GetMouseButtonUp(0)) { m_cursorIsLocked = true; } if (m_cursorIsLocked) { UnlockCursor(); } else if (!m_cursorIsLocked) { LockCursor(); } } private void UnlockCursor() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } private void LockCursor() { Cursor.lockState = CursorLockMode.None; Cursor.visible = true; } }