2024-06-09 18:19:32 +00:00
|
|
|
using System.Collections;
|
|
|
|
using BlueWater.Utility;
|
2024-06-24 09:54:47 +00:00
|
|
|
using Sirenix.OdinInspector;
|
2024-06-09 18:19:32 +00:00
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.Rendering;
|
|
|
|
using UnityEngine.Rendering.Universal;
|
|
|
|
|
|
|
|
namespace BlueWater
|
|
|
|
{
|
|
|
|
public enum RendererFeatureName
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
GrayscaleRenderPassFeature
|
|
|
|
}
|
|
|
|
|
|
|
|
public class PostProcessingManager : Singleton<PostProcessingManager>
|
|
|
|
{
|
|
|
|
private UniversalRenderPipelineAsset _currentRenderPipeline;
|
|
|
|
private ScriptableRendererData _currentRenderData;
|
|
|
|
private Volume _currentVolume;
|
|
|
|
private Coroutine _lowHpVignetteCoroutine;
|
2024-06-24 09:54:47 +00:00
|
|
|
|
|
|
|
// LowHpVignette
|
|
|
|
[Title("LowHpVignette")]
|
|
|
|
[SerializeField]
|
|
|
|
private bool _isLerpIntensity = true;
|
|
|
|
|
|
|
|
[SerializeField]
|
|
|
|
private float _startIntensity = 0.15f;
|
|
|
|
|
|
|
|
[SerializeField, ShowIf("@_isLerpIntensity")]
|
|
|
|
private float _endIntensity = 0.2f;
|
|
|
|
|
|
|
|
[SerializeField, ShowIf("@_isLerpIntensity")]
|
|
|
|
private float _lerpTime = 1f;
|
2024-06-09 18:19:32 +00:00
|
|
|
|
|
|
|
protected override void OnAwake()
|
|
|
|
{
|
|
|
|
Initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void OnApplicationQuit()
|
|
|
|
{
|
|
|
|
ToggleRendererFeature(RendererFeatureName.GrayscaleRenderPassFeature, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Initialize()
|
|
|
|
{
|
|
|
|
_currentRenderPipeline = (UniversalRenderPipelineAsset)GraphicsSettings.currentRenderPipeline;
|
|
|
|
_currentRenderData = _currentRenderPipeline.rendererDataList[0];
|
|
|
|
_currentVolume = GetComponent<Volume>();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void ToggleRendererFeature(RendererFeatureName featureName, bool value)
|
|
|
|
{
|
|
|
|
foreach (var element in _currentRenderData.rendererFeatures)
|
|
|
|
{
|
|
|
|
if (!string.Equals(element.name, featureName.ToString())) continue;
|
|
|
|
|
|
|
|
element.SetActive(value);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Debug.Log($"{featureName}과 일치하는 기능이 없습니다.");
|
|
|
|
}
|
|
|
|
|
|
|
|
public void ToggleEffect<T>(bool value) where T : VolumeComponent
|
|
|
|
{
|
|
|
|
if (!_currentVolume) return;
|
|
|
|
|
|
|
|
var effect = GetEffect<T>();
|
|
|
|
if (!effect)
|
|
|
|
{
|
|
|
|
print(typeof(T) + "효과가 없습니다.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
effect.active = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
private T GetEffect<T>() where T : VolumeComponent
|
|
|
|
{
|
|
|
|
if (!_currentVolume) return null;
|
|
|
|
|
|
|
|
_currentVolume.profile.TryGet(out T effect);
|
|
|
|
return effect;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void LowHpVignette()
|
|
|
|
{
|
|
|
|
Utils.StartUniqueCoroutine(this, ref _lowHpVignetteCoroutine, LowHpVignetteCoroutine());
|
|
|
|
}
|
|
|
|
|
|
|
|
public void DefaultHpVignette()
|
|
|
|
{
|
|
|
|
Utils.EndUniqueCoroutine(this, ref _lowHpVignetteCoroutine);
|
|
|
|
ToggleEffect<Vignette>(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private IEnumerator LowHpVignetteCoroutine()
|
|
|
|
{
|
|
|
|
var vignette = GetEffect<Vignette>();
|
2024-06-24 09:54:47 +00:00
|
|
|
vignette.intensity.value = _startIntensity;
|
2024-06-09 18:19:32 +00:00
|
|
|
vignette.active = true;
|
|
|
|
|
2024-06-24 09:54:47 +00:00
|
|
|
if (!_isLerpIntensity) yield break;
|
|
|
|
|
|
|
|
var elapsedTime = 0f;
|
2024-06-09 18:19:32 +00:00
|
|
|
while (true)
|
|
|
|
{
|
2024-06-24 09:54:47 +00:00
|
|
|
vignette.intensity.value = Mathf.Lerp(_startIntensity, _endIntensity, elapsedTime);
|
|
|
|
if (elapsedTime >= _lerpTime)
|
2024-06-09 18:19:32 +00:00
|
|
|
{
|
2024-06-24 09:54:47 +00:00
|
|
|
(_startIntensity, _endIntensity) = (_endIntensity, _startIntensity);
|
|
|
|
elapsedTime = 0f;
|
2024-06-09 18:19:32 +00:00
|
|
|
}
|
2024-06-24 09:54:47 +00:00
|
|
|
elapsedTime += Time.deltaTime;
|
2024-06-09 18:19:32 +00:00
|
|
|
yield return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|