OldBlueWater/BlueWater/Assets/02.Scripts/VisualFeedbackManager.cs

121 lines
3.4 KiB
C#
Raw Normal View History

using System;
2023-11-29 02:39:46 +00:00
using System.Collections;
using Cinemachine;
using MoreMountains.Feedbacks;
using MoreMountains.FeedbacksForThirdParty;
2023-11-29 02:39:46 +00:00
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.SceneManagement;
2023-11-29 02:39:46 +00:00
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class VisualFeedbackManager : Singleton<VisualFeedbackManager>
2023-11-29 02:39:46 +00:00
{
private Vignette vignette;
private void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
vignette = null;
vignette = GetEffect<Vignette>();
}
#region HitStop
2023-11-29 02:39:46 +00:00
/// <summary>
/// 히트스톱
/// </summary>
/// <param name="duration">시간</param>
public void TriggerHitStop(float duration)
{
StartCoroutine(HitStopCoroutine(duration));
}
private IEnumerator HitStopCoroutine(float duration)
{
2023-12-11 07:00:09 +00:00
var originalTimeScale = 1;
2023-11-29 02:39:46 +00:00
Time.timeScale = 0.05f;
yield return new WaitForSecondsRealtime(duration);
Time.timeScale = originalTimeScale;
}
#endregion
#region CameraShake
public void CameraShake(CinemachineVirtualCamera virtualCamera, float power = 0.5f, float duration = 0.1f)
{
var mmfPlayer = virtualCamera.transform.gameObject.GetComponent<MMF_Player>();
var cinemachineImpulse = mmfPlayer.GetFeedbackOfType<MMF_CinemachineImpulse>();
var impulselistener = virtualCamera.transform.gameObject.GetComponent<CinemachineImpulseListener>();
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();
}
#region PostProcessing
public void ToggleEffect<T>(bool value) where T : VolumeComponent
{
var effect = GetEffect<T>();
if (effect == null)
{
print(typeof(T) + "효과가 없습니다.");
return;
}
effect.active = value;
}
private T GetEffect<T>() where T : VolumeComponent
{
var postProcessVolume = FindAnyObjectByType<Volume>();
if (postProcessVolume == null)
{
print("Volume 컴포넌트를 가진 오브젝트가 없습니다.");
return null;
}
postProcessVolume.profile.TryGet(out T effect);
return effect;
}
public void SetVignetteIntensity(float intensity)
{
if (vignette == null)
{
vignette = GetEffect<Vignette>();
}
if (vignette != null)
{
vignette.intensity.value = intensity;
}
else
{
print("vignette is null.");
}
}
#endregion
#endregion
2023-11-29 02:39:46 +00:00
}
}