Paste
Of Code


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
    }
}

Toggle: theme, font