using UnityEngine; public class HeadBobber : MonoBehaviour { [Header("Settings")] public float bobSpeed = 14f; // How fast the head bobs public float bobAmount = 0.05f; // How high/low the head goes [Tooltip("Reference to the parent player object")] public CharacterController playerController; private float defaultPosY = 0; private float timer = 0; void Start() { // Remember where the camera is supposed to be normally defaultPosY = transform.localPosition.y; } void Update() { if (playerController == null) return; // Only bob if we are moving roughly walking speed // (magnitude > 0.1f) means we are moving if (Mathf.Abs(playerController.velocity.x) > 0.1f || Mathf.Abs(playerController.velocity.z) > 0.1f) { // Calculate the Sine Wave timer += Time.deltaTime * bobSpeed; float newY = defaultPosY + Mathf.Sin(timer) * bobAmount; // Apply it transform.localPosition = new Vector3(transform.localPosition.x, newY, transform.localPosition.z); } else { // Reset to neutral when stopped timer = 0; Vector3 targetPos = new Vector3(transform.localPosition.x, defaultPosY, transform.localPosition.z); transform.localPosition = Vector3.Lerp(transform.localPosition, targetPos, Time.deltaTime * 5f); } } }