using System.Collections; using DDD.Audios; using Unity.Cinemachine; using UnityEngine; public class VisualFeedbackManager : Singleton { private float _baseTimeScale = 1f; private float _currentHitStopCoefficient = 1f; private void Start() { ResetTimeScale(); } public void SetBaseTimeScale(float value) { _baseTimeScale = value; UpdateTimeScale(); } public void SetHitStop(float value) { _currentHitStopCoefficient = value; UpdateTimeScale(); } public void ResetTimeScale() { _baseTimeScale = 1f; _currentHitStopCoefficient = 1f; UpdateTimeScale(); } private void UpdateTimeScale() { Time.timeScale = _baseTimeScale * _currentHitStopCoefficient; Time.fixedDeltaTime = Time.timeScale * 0.02f; AudioManager.Instance.SetPitchSfxAll(Time.timeScale); } #region HitStop public void TriggerHitStop(float duration) { StartCoroutine(HitStopCoroutine(duration)); } private IEnumerator HitStopCoroutine(float duration) { SetHitStop(0.05f); yield return new WaitForSecondsRealtime(duration); SetHitStop(1f); } #endregion #region CameraShake public void CameraShake(CinemachineCamera cinemachineCamera, float power = 0.5f, float duration = 0.1f) { var impulseListener = cinemachineCamera.GetComponent(); var impulseSource = cinemachineCamera.GetComponent(); impulseSource.DefaultVelocity = new Vector3(0.5f, 0.5f, 0.5f); impulseListener.Gain = power; impulseSource.ImpulseDefinition.TimeEnvelope.SustainTime = duration; impulseSource.ImpulseDefinition.TimeEnvelope.DecayTime = 0.2f; impulseSource.GenerateImpulse(); } #endregion }