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