Paste
Of Code


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
using UnityEngine;
using UnityEngine.InputSystem;


public class HeadBobbing : MonoBehaviour
{
    [Header("References")]
    [SerializeField] private InputHolder inputHolder;
    [SerializeField] private PlayerMovement playerMovement;
    [Space]
    [Header("Idle HeadBob")]
    [SerializeField, Range(-100f, 100f)] private float idle_HeadbobAmount;
    [SerializeField, Range(-100f, 100f)] private float idle_HeadbobSpeed;
    [SerializeField, Range(-100f, 100f)] private float idle_RotationAmount;
    [Space]
    [Header("Walking HeadBob")]
    [SerializeField, Range(-100f, 100f)] private float walking_HeadbobAmount;
    [SerializeField, Range(-100f, 100f)] private float walking_HeadbobSpeed;
    [Space]
    [Header("Sprinting HeadBob")]
    [SerializeField, Range(-100f, 100f)] private float sprinting_HeadbobAmount;
    [SerializeField, Range(-100f, 100f)] private float sprinting_HeadbobSpeed;
    [Space]
    [Header("Crouching HeadBob")]
    [SerializeField, Range(-100f, 100f)] private float crouching_HeadbobAmount;
    [SerializeField, Range(-100f, 100f)] private float crouching_HeadbobSpeed;


    private Vector2 moveInput;
    private Vector3 startLocalPos;



    private void Awake()
    {
        startLocalPos = transform.localPosition;

    }

    private void Update()
    {
        ReadInput();
        UpdateHeadBobState();


    }

    private void UpdateHeadBobState()
    {
        bool isMoving = moveInput.sqrMagnitude > 0.1f;
        bool isSprinting = inputHolder.runAction.action.IsPressed();

        if (!isMoving)
        {
            if (playerMovement.isCrouching)
            {
                CrouchHeadBob();

            }
            else
            {
                IdleHeadBob();

            }
        }
        else if (isSprinting)
        {
            RunHeadBob();
        }
        else
        {
            WalkHeadBob(); 
        }
    }

    private void IdleHeadBob()
    {
        if (moveInput.sqrMagnitude < 1f)
        {
            float idleSin = ApplyIdleSinBob();

            transform.SetLocalPositionAndRotation(startLocalPos + Vector3.up * idleSin, Quaternion.Euler(idleSin * idle_RotationAmount, 0f, 0f) * transform.localRotation);

        }
        else
        {
            transform.localPosition = startLocalPos;

        }

    }

    private void WalkHeadBob()
    {
        if (moveInput.sqrMagnitude > 0.1f)
        {
            float walkingSin = ApplyWalkingSinBob();
            
            transform.localPosition = startLocalPos + Vector3.up * walkingSin;
        }
        else
        {
            transform.position = startLocalPos;
        }

    }

    private void RunHeadBob()
    {
        if (moveInput.sqrMagnitude > 0.1f)
        {
            
        }
        
    }

    private void CrouchHeadBob()
    {
        if (moveInput.sqrMagnitude < 1)
        {
            
        }
    }




    private float ApplyIdleSinBob()
    {
        return Mathf.Sin(Time.time * idle_HeadbobSpeed) * idle_HeadbobAmount;
    }

    private float ApplyWalkingSinBob()
    {
        return Mathf.Sin(Time.time * walking_HeadbobSpeed) * walking_HeadbobAmount;
    }


    private void ReadInput()
    {
        moveInput = inputHolder.moveAction.action.ReadValue<Vector2>();
    }
}

Toggle: theme, font