using System.Collections; using UnityEngine; using Cinemachine; // Ensure you have the Cinemachine namespace public class CameraShaker : MonoBehaviour { public static CameraShaker Instance; public CinemachineCameraOffset offsetter; // Variables for tracking shake duration and original offset private Vector3 originalOffset; private Coroutine shakeCoroutine; private void Awake() { if (Instance == null) { Instance = this; originalOffset = new Vector3(0, 0, 0); // Initialize with your default offset } else { Destroy(gameObject); } offsetter = GetComponent(); } public static void ShakecShake(float strength, float time) { // Check if a shake is already happening and restart it if so if (Instance.shakeCoroutine != null) { Instance.StopCoroutine(Instance.shakeCoroutine); } Instance.shakeCoroutine = Instance.StartCoroutine(Instance.DoShake(strength, time)); } private IEnumerator DoShake(float strength, float time) { float elapsed = 0f; while (elapsed < time) { elapsed += Time.deltaTime; float x = Random.Range(-1f, 1f) * strength; float y = Random.Range(-1f, 1f) * strength; offsetter.m_Offset = new Vector3(x, y, originalOffset.z); yield return null; // Wait for the next frame } // Reset the offset to the original position offsetter.m_Offset = originalOffset; } }