Add utils + refacto

This commit is contained in:
2026-01-30 17:39:26 +01:00
parent 9ff17b5305
commit 23d3cb5d2c
29 changed files with 675 additions and 461 deletions
@@ -1,6 +1,7 @@
using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
using Unheimlich.Utility;
namespace Unheimlich.Audio
{
@@ -24,8 +25,8 @@ namespace Unheimlich.Audio
private const string CONTINUOUS_AUDIO_SOURCE_NAME = "Continuous Audio Source";
// Volume multipliers for concentration system
private const float BASELINE_VOLUME_MULTIPLIER = 0.3f;
private const float FULL_VOLUME_MULTIPLIER = 1f;
private const float BASELINE_VOLUME_MULTIPLIER = 0.1f;
private const float FULL_VOLUME_MULTIPLIER = 1.5f;
private const float CONCENTRATION_FADE_DURATION = 1f;
private const float RELEASE_FADE_DURATION = 0.5f;
@@ -78,7 +79,8 @@ namespace Unheimlich.Audio
private AudioClip _continuousClip;
private Coroutine _volumeFadeCoroutine;
private Coroutine _startListeningCoroutine;
private Coroutine _concentrationFadeCoroutine;
private int _concentrationFadeTweenId = -1;
private int _crossfadeTweenId = -1;
/// <summary>
/// Returns true if this emitter has been tapped during the current listening session.
@@ -147,18 +149,34 @@ namespace Unheimlich.Audio
/// </summary>
public void SetConcentrating(bool concentrating)
{
TweenHelper.CancelTween(ref _concentrationFadeTweenId);
if (_concentrationFadeCoroutine != null)
StopCoroutine(_concentrationFadeCoroutine);
if (_continuousAudioSource == null)
return;
if (concentrating)
{
_concentrationFadeCoroutine = StartCoroutine(FadeConcentrationVolume(BASELINE_VOLUME_MULTIPLIER, FULL_VOLUME_MULTIPLIER, CONCENTRATION_FADE_DURATION));
}
else
{
_concentrationFadeCoroutine = StartCoroutine(FadeConcentrationVolume(FULL_VOLUME_MULTIPLIER, BASELINE_VOLUME_MULTIPLIER, RELEASE_FADE_DURATION));
}
float baseVolume = _continuousBaseVolume;
float fromMultiplier = concentrating ? BASELINE_VOLUME_MULTIPLIER : FULL_VOLUME_MULTIPLIER;
float toMultiplier = concentrating ? FULL_VOLUME_MULTIPLIER : BASELINE_VOLUME_MULTIPLIER;
float duration = concentrating ? CONCENTRATION_FADE_DURATION : RELEASE_FADE_DURATION;
float fromVolume = baseVolume * fromMultiplier;
float toVolume = baseVolume * toMultiplier;
_concentrationFadeTweenId = TweenHelper.FadeVolume(
_continuousAudioSource,
toVolume,
duration);
}
public void ResetConcentrationVolume()
{
TweenHelper.CancelTween(ref _concentrationFadeTweenId);
if (_continuousAudioSource == null)
return;
float baselineVolume = _continuousBaseVolume * BASELINE_VOLUME_MULTIPLIER;
_continuousAudioSource.volume = baselineVolume;
}
/// <summary>
@@ -197,8 +215,22 @@ namespace Unheimlich.Audio
if (_volumeFadeCoroutine != null)
StopCoroutine(_volumeFadeCoroutine);
TweenHelper.CancelTween(ref _crossfadeTweenId);
float crossfadeDuration = 1f;
_volumeFadeCoroutine = StartCoroutine(CrossfadeSounds(crossfadeDuration));
if (_continuousAudioSource != null)
{
_crossfadeTweenId = TweenHelper.FadeVolume(
_continuousAudioSource,
0f,
crossfadeDuration,
() =>
{
if (_continuousAudioSource != null)
_continuousAudioSource.Stop();
});
}
if (_emitterParticles != null)
{
@@ -231,7 +263,7 @@ namespace Unheimlich.Audio
/// This is the only place where _hasBeenTapped is reset to false,
/// allowing the emitter to be used again in a future listening session.
/// </summary>
public void StopListening()
public void StopListening(bool cancelConcentrationFade = true)
{
bool wasBeenTapped = _hasBeenTapped;
@@ -244,8 +276,8 @@ namespace Unheimlich.Audio
if (_startListeningCoroutine != null)
StopCoroutine(_startListeningCoroutine);
if (_concentrationFadeCoroutine != null)
StopCoroutine(_concentrationFadeCoroutine);
if (cancelConcentrationFade)
TweenHelper.CancelTween(ref _concentrationFadeTweenId);
if (_audioSource != null && _audioSource.isPlaying)
_audioSource.Stop();
@@ -400,59 +432,6 @@ namespace Unheimlich.Audio
Gamepad.current.SetMotorSpeeds(intensity, intensity);
}
private IEnumerator FadeConcentrationVolume(float fromMultiplier, float toMultiplier, float duration)
{
float elapsed = 0f;
float baseVolume = _continuousBaseVolume;
while (elapsed < duration)
{
elapsed += Time.deltaTime;
float t = elapsed / duration;
float currentMultiplier = Mathf.Lerp(fromMultiplier, toMultiplier, t);
if (_continuousAudioSource != null)
{
_continuousAudioSource.volume = baseVolume * currentMultiplier;
}
yield return null;
}
if (_continuousAudioSource != null)
{
_continuousAudioSource.volume = baseVolume * toMultiplier;
}
}
private IEnumerator CrossfadeSounds(float fadeDuration)
{
if (_continuousAudioSource == null)
yield break;
float startVolume = _continuousAudioSource.volume;
float elapsed = 0f;
while (elapsed < fadeDuration)
{
elapsed += Time.deltaTime;
float t = elapsed / fadeDuration;
if (_continuousAudioSource != null)
{
_continuousAudioSource.volume = Mathf.Lerp(startVolume, 0f, t);
}
yield return null;
}
if (_continuousAudioSource != null)
{
_continuousAudioSource.volume = 0f;
_continuousAudioSource.Stop();
}
}
private void UpdateVibration()
{
if (!_enableVibration || Gamepad.current == null)
@@ -50,6 +50,8 @@ namespace Unheimlich.Audio
private void RefreshListenablesList()
{
_allListenables = FindObjectsByType<AudioListenable>(FindObjectsSortMode.None);
if (!_showDebugInfo)
return;
Debug.Log($"Found {_allListenables.Length} AudioListenable objects in scene");
}