using UnityEngine; using System.Collections; using Cinemachine; public class CinemachineShake : MonoBehaviour { public static CinemachineShake Instance { get; private set; } private CinemachineFreeLook freeLookCamera; private Coroutine shakeCoroutine; private void Awake() { if (Instance == null) { Instance = this; } else { Destroy(gameObject); } freeLookCamera = GetComponent(); if (freeLookCamera == null) { Debug.LogError("[FreeLookCameraShake] No Cinemachine FreeLook Camera found!"); } } public void Shake(float duration = 0.3f, float magnitude = 0.2f) { if (shakeCoroutine != null) { StopCoroutine(shakeCoroutine); } shakeCoroutine = StartCoroutine(ShakeRoutine(duration, magnitude)); } private IEnumerator ShakeRoutine(float duration, float magnitude) { float elapsed = 0f; float originalX = freeLookCamera.m_XAxis.Value; float originalY = freeLookCamera.m_YAxis.Value; while (elapsed < duration) { freeLookCamera.m_XAxis.Value = originalX + Random.Range(-magnitude, magnitude); freeLookCamera.m_YAxis.Value = originalY + Random.Range(-magnitude, magnitude); elapsed += Time.deltaTime; yield return null; } freeLookCamera.m_XAxis.Value = originalX; // Reset horizontal shake freeLookCamera.m_YAxis.Value = originalY; // Reset vertical shake } }