using UnityEngine; public class CameraShake : MonoBehaviour { public static CameraShake Instance { get; private set; } private float shakeDuration = 0f; private float shakeIntensity = 0f; private float shakeFalloff = 1f; private Vector3 originalLocalPos; private bool shaking = false; void Awake() { Instance = this; originalLocalPos = transform.localPosition; } void LateUpdate() { if (!shaking) return; if (shakeDuration > 0f) { Vector3 offset = Random.insideUnitSphere * shakeIntensity; offset.z = 0f; // Keep shake on X/Y only transform.localPosition = originalLocalPos + offset; shakeDuration -= Time.deltaTime; shakeIntensity = Mathf.Lerp(shakeIntensity, 0f, Time.deltaTime * shakeFalloff); } else { shaking = false; shakeDuration = 0f; transform.localPosition = originalLocalPos; } } /// /// Trigger a camera shake. /// /// How long to shake (seconds) /// How far to displace the camera public void Shake(float duration, float intensity) { shakeDuration = duration; shakeIntensity = intensity; shakeFalloff = intensity / duration; shaking = true; } }