using UnityEngine; using UnityEngine.InputSystem; public class BallController : MonoBehaviour { [Header("References")] [SerializeField] Rigidbody rb; [Space] [Header("Movement Settings")] [SerializeField] private float moveSpeed; [SerializeField] private float jumpHeight; [SerializeField] private float airSpeed; [Space] [Header("Grounded Settings")] [SerializeField] private LayerMask groundLayer; [SerializeField] private float radius; [SerializeField] private float maxDistance; [SerializeField] private bool isGrounded; [Space] [Header("Slope Settings")] [SerializeField] private float maxSlopeAngle; [Space] [Header("Input Action References")] [SerializeField] private InputActionReference moveAction; [SerializeField] private InputActionReference jumpAction; private Vector2 currentInput; RaycastHit hit; private RaycastHit slopeHit; void Start() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update() { HandleInput(); GroundCheck(); HandleJump(); } private void FixedUpdate() { HandleMovement(); } private void HandleMovement() { Vector2 input = Vector2.ClampMagnitude(currentInput, 1f); Vector3 move = Vector3.forward * input.x + -Vector3.right * input.y; float currentSpeed = isGrounded ? moveSpeed : airSpeed; rb.AddForce(move * currentSpeed, ForceMode.Force); } private void HandleJump() { if (jumpAction.action.WasPerformedThisFrame() && isGrounded) { rb.AddForce(Vector3.up * jumpHeight, ForceMode.Impulse); rb.linearDamping = 0f; } } private void GroundCheck() { isGrounded = (Physics.SphereCast(transform.position, radius, Vector3.down, out hit, maxDistance, groundLayer)); if (isGrounded) { rb.linearDamping = 3f; } else { rb.linearDamping = 0f; } } private void HandleInput() { currentInput = moveAction.action.ReadValue<Vector2>(); } }