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