using System.Collections; using Cinemachine; using MoreMountains.Feedbacks; using MoreMountains.FeedbacksForThirdParty; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class VisualFeedbackManager : Singleton { private float baseTimeScale = 1f; private float currentHitStopCoefficient = 1f; 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; } #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(CinemachineVirtualCamera virtualCamera, float power = 0.5f, float duration = 0.1f) { var mmfPlayer = virtualCamera.transform.gameObject.GetComponent(); var cinemachineImpulse = mmfPlayer.GetFeedbackOfType(); var impulselistener = virtualCamera.transform.gameObject.GetComponent(); cinemachineImpulse.Velocity = new Vector3(0.5f, 0.5f, 0.5f); impulselistener.m_Gain = power; cinemachineImpulse.m_ImpulseDefinition.m_TimeEnvelope.m_SustainTime = duration; cinemachineImpulse.m_ImpulseDefinition.m_TimeEnvelope.m_DecayTime = 0.2f; mmfPlayer.PlayFeedbacks(); } #endregion } }