using Cinemachine; using UnityEngine; namespace SimpleTools.Cinemachine { public static class ScreenShake { static CinemachineVirtualCamera vCam; static ScreenShakeUpdate shakeUpdate; class ScreenShakeUpdate : MonoBehaviour { [HideInInspector] public float shakeTimer; [HideInInspector] public float shakeTimerTotal; [HideInInspector] public float startingIntensity; void Update() { if (shakeTimer > 0) { shakeTimer -= Time.deltaTime; CinemachineBasicMultiChannelPerlin multiChannelPerlin = vCam.GetCinemachineComponent(); multiChannelPerlin.m_AmplitudeGain = Mathf.Lerp(startingIntensity, 0f, 1 - (shakeTimer / shakeTimerTotal)); } } } /// Shake the camera /// It needs a cinemachine camera with a noise profile in it. /// public static void Shake(float intensity, float time) { if (vCam == null) { vCam = Camera.main.GetComponent().ActiveVirtualCamera.VirtualCameraGameObject.GetComponent(); } if (shakeUpdate == null) { shakeUpdate = new GameObject("ShakeUpdate").AddComponent(); } shakeUpdate.startingIntensity = intensity; shakeUpdate.shakeTimer = shakeUpdate.shakeTimerTotal = time; } } }