using System.Xml.Serialization; using UnityEngine; using UnityEngine.InputSystem; public class HeavyBall : MonoBehaviour { [Header("References")] [SerializeField] private PlayerInputManager playerInputManager; [SerializeField] private Rigidbody rb; [Space] [Header("Player Parameters")] [SerializeField, Range(0f, 100f)] private float moveSpeed; [SerializeField, Range(0f, 100f)] private float jumpHeight; [SerializeField, Range(0f, 100f)] private float smallJumpHeight; [SerializeField, Range(0f, 100f)] private float airSpeed; [Space] [Header("Jump Settings")] [Space] [Header("Grounded Settings")] [SerializeField] private LayerMask groundLayer; [SerializeField, Range(0f, 100f)] private float radius; [SerializeField, Range(0f, 100f)] private float maxDistance; [SerializeField, Range(0f, 100f)] private float groundDamping; [SerializeField, Range(0f, 100f)] private float airDamping; [Space] [Header("Custom Gravity Parameters")] [SerializeField, Range(0f, 100f)] private float playerGravity; [SerializeField, Range(0f, 100f)] private float groundMultiplier; [SerializeField, Range(0f, 100f)] private float upwardMultiplier; [SerializeField, Range(0f, 100f)] private float downwardMultiplier; [Space] [Header("Bool Parameters")] [SerializeField] private bool isMoving; [SerializeField] private bool isGrounded; Vector2 currentInput; Vector3 moveDirection; RaycastHit hit; private void Update() { HandleInput(); HandleJump(); } private void FixedUpdate() { HandleMovement(); HandleGroundCheck(); HandleCustomGravity(); } private void HandleMovement() { Vector2 input = Vector2.ClampMagnitude(currentInput, 1f); moveDirection = Vector3.forward * input.x + -Vector3.right * input.y; moveDirection = moveDirection.normalized; float currentSpeed = isGrounded ? moveSpeed : airSpeed; rb.AddForce(moveDirection * currentSpeed, ForceMode.Force); } private void HandleJump() { if (playerInputManager.jumpAction.action.WasPerformedThisFrame() && isGrounded) { isGrounded = false; rb.AddForce(2 * jumpHeight * Vector3.up, ForceMode.Force); } } private void HandleGroundCheck() { isGrounded = (Physics.SphereCast(transform.position, radius, Vector3.down, out hit, maxDistance, groundLayer)); if (isGrounded) { rb.linearDamping = groundDamping; } else { rb.linearDamping = airDamping; } } private void HandleCustomGravity() { if (isGrounded) { rb.AddForce(Physics.gravity * groundMultiplier, ForceMode.Acceleration); } else { if (rb.linearVelocity.y > 0f) { rb.AddForce(Physics.gravity * upwardMultiplier, ForceMode.Acceleration); } else if (rb.linearVelocity.y < 0f) { rb.AddForce(Physics.gravity * downwardMultiplier, ForceMode.Acceleration); } } } private void HandleInput() { currentInput = playerInputManager.moveAction.action.ReadValue<Vector2>(); isMoving = currentInput.sqrMagnitude > 0.01f; } }