wirm/Game/Assets/Scripts/PostProcessingManager.cs

178 lines
5.9 KiB
C#
Raw Normal View History

/*
* Author: Reza
* Date: 7/2/25
* Description: Post-processing camera effects emulating various conditions
*/
using System.Collections;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class PostProcessingManager : MonoBehaviour
{
public static PostProcessingManager Instance;
2025-02-11 15:01:17 +08:00
// Defines the Global Volume
public Volume volume;
2025-02-11 15:01:17 +08:00
[Header("Effect Intensities")]
// Editable override values in inspector
[SerializeField]
public AnimationCurve vignetteIntensity;
2025-02-11 15:01:17 +08:00
[SerializeField] public AnimationCurve chromaticAberrationIntensity;
[SerializeField] public AnimationCurve motionBlurIntensity;
[SerializeField] public AnimationCurve lensDistortionIntensity;
[SerializeField] public AnimationCurve colorAdjustmentsIntensity;
// Defines Audio References
[Header("Audio References")] public AudioSource audioSource;
2025-02-11 15:01:17 +08:00
public AudioClip heartbeatSound;
public AudioClip whisperSound;
public AudioClip distortedWhisperSound;
private ChromaticAberration _chromaticAberration;
private ColorAdjustments _colorAdjustments;
2025-02-11 15:01:17 +08:00
2025-02-13 19:49:34 +08:00
// Holds the current effect name to manage stopping and starting dynamically
private string _currentEffectName = "";
// Checks if effect is active or not
private bool _isEffectActive;
private LensDistortion _lensDistortion;
private MotionBlur _motionBlur;
// All the effect overrides
private Vignette _vignette;
2025-02-11 15:01:17 +08:00
private void Awake()
2025-02-10 16:12:57 +08:00
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
2025-02-11 15:01:17 +08:00
// Start is called before the first frame update
private void Start()
{
// Get references for effects
volume.profile.TryGet(out _vignette);
volume.profile.TryGet(out _chromaticAberration);
volume.profile.TryGet(out _motionBlur);
volume.profile.TryGet(out _lensDistortion);
volume.profile.TryGet(out _colorAdjustments);
}
2025-02-13 19:49:34 +08:00
// Checks if an effect is currently active
public bool IsEffectActive()
{
return _isEffectActive;
}
2025-02-11 15:01:17 +08:00
2025-02-13 19:49:34 +08:00
// Function to trigger effects dynamically based on the effect name passed
public void TriggerEffect(string effectName)
{
2025-02-13 19:49:34 +08:00
// If an effect is already active, stop the current one
if (_isEffectActive) StopEffect(_currentEffectName);
2025-02-13 19:49:34 +08:00
// Start the new effect
StartEffect(effectName);
}
2025-02-13 19:49:34 +08:00
// Start a specific effect
2025-02-10 16:12:57 +08:00
public void StartEffect(string effectName)
{
_isEffectActive = true;
_currentEffectName = effectName;
2025-02-11 15:01:17 +08:00
StartCoroutine(ApplyEffect(effectName));
}
2025-02-11 15:01:17 +08:00
2025-02-13 19:49:34 +08:00
// Stop the active effect
public void StopEffect()
{
if (_isEffectActive) StopEffect(_currentEffectName);
2025-02-13 19:49:34 +08:00
}
// Stop a specific effect
private void StopEffect(string effectName)
{
_isEffectActive = false;
_currentEffectName = "";
2025-02-11 15:01:17 +08:00
// Reset effects to default
if (_vignette) _vignette.intensity.Override(0f);
if (_chromaticAberration) _chromaticAberration.intensity.Override(0f);
if (_motionBlur) _motionBlur.intensity.Override(0f);
if (_lensDistortion) _lensDistortion.intensity.Override(0f);
if (_colorAdjustments) _colorAdjustments.postExposure.Override(0f);
2025-02-11 15:01:17 +08:00
2025-02-13 19:49:34 +08:00
// Stop the audio
if (audioSource) audioSource.Stop();
}
2025-02-13 19:49:34 +08:00
// Applies effects over time based on the effect name
private IEnumerator ApplyEffect(string effectName)
{
switch (effectName)
2025-02-11 15:01:17 +08:00
{
// Handle audio for the effect
case "Panic":
audioSource.clip = heartbeatSound;
audioSource.loop = true;
audioSource.Play();
break;
case "Headache":
audioSource.clip = whisperSound;
audioSource.loop = true;
audioSource.Play();
break;
case "Dizziness":
audioSource.clip = distortedWhisperSound;
audioSource.loop = true;
audioSource.Play();
break;
2025-02-11 15:01:17 +08:00
}
2025-02-11 15:01:17 +08:00
// Apply effects while the effect is active
while (_isEffectActive)
{
switch (effectName)
2025-02-11 15:01:17 +08:00
{
// Visual effects for headache
case "Headache":
_vignette.intensity.Override(vignetteIntensity.Evaluate(Time.time));
_chromaticAberration.intensity.Override(chromaticAberrationIntensity.Evaluate(Time.time));
break;
// Visual effects for dizziness
case "Dizziness":
_motionBlur.intensity.Override(motionBlurIntensity.Evaluate(Time.time));
_lensDistortion.intensity.Override(lensDistortionIntensity.Evaluate(Time.time));
break;
// Visual effects for panic
case "Panic":
_motionBlur.intensity.Override(motionBlurIntensity.Evaluate(Time.time));
_lensDistortion.intensity.Override(lensDistortionIntensity.Evaluate(Time.time));
_chromaticAberration.intensity.Override(chromaticAberrationIntensity.Evaluate(Time.time));
break;
case "Worst":
_vignette.intensity.Override(vignetteIntensity.Evaluate(Time.time));
_motionBlur.intensity.Override(motionBlurIntensity.Evaluate(Time.time));
_lensDistortion.intensity.Override(lensDistortionIntensity.Evaluate(Time.time));
_chromaticAberration.intensity.Override(chromaticAberrationIntensity.Evaluate(Time.time));
_colorAdjustments.postExposure.Override(colorAdjustmentsIntensity.Evaluate(Time.time * 0.8f));
break;
}
2025-02-13 19:49:34 +08:00
yield return 0;
}
2025-02-10 16:12:57 +08:00
2025-02-13 19:49:34 +08:00
// Stop audio after the effect ends
if (audioSource && audioSource.isPlaying) audioSource.Stop();
2025-02-10 16:12:57 +08:00
}
}