70 lines
3.1 KiB
C#
70 lines
3.1 KiB
C#
/*! \cond PRIVATE */
|
|
using UnityEngine;
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace DarkTonic.MasterAudio {
|
|
// ReSharper disable once CheckNamespace
|
|
public static class AudioPrioritizer {
|
|
private const int MaxPriority = 0;
|
|
private const int HighestPriority = 16;
|
|
private const int LowestPriority = 128;
|
|
|
|
public static void Set2DSoundPriority(AudioSource audio) {
|
|
audio.priority = HighestPriority;
|
|
}
|
|
|
|
public static void SetSoundGroupInitialPriority(AudioSource audio) {
|
|
audio.priority = LowestPriority;
|
|
}
|
|
|
|
public static void SetPreviewPriority(AudioSource audio) {
|
|
audio.priority = MaxPriority;
|
|
}
|
|
|
|
public static void Set3DPriority(SoundGroupVariation variation, bool useClipAgePriority) {
|
|
if (MasterAudio.ListenerTrans == null) {
|
|
// can't prioritize.
|
|
return;
|
|
}
|
|
|
|
var audio = variation.VarAudio;
|
|
|
|
if (audio.spatialBlend == 0f) {
|
|
// handle 2D sound if we end here with it.
|
|
Set2DSoundPriority(variation.VarAudio);
|
|
return;
|
|
}
|
|
|
|
var distanceToListener = Vector3.Distance(audio.transform.position, MasterAudio.ListenerTrans.position);
|
|
float perceivedVolume;
|
|
|
|
switch (audio.rolloffMode) {
|
|
case AudioRolloffMode.Logarithmic:
|
|
perceivedVolume = audio.volume / Mathf.Max(audio.minDistance, distanceToListener - audio.minDistance);
|
|
// Unity seems to just use a 1/distance model for this
|
|
break;
|
|
case AudioRolloffMode.Linear:
|
|
perceivedVolume = Mathf.Lerp(audio.volume, 0,
|
|
Mathf.Max(0, distanceToListener - audio.minDistance) / (audio.maxDistance - audio.minDistance));
|
|
// Linearly interpolate from max volume to zero as we go from the minimum distance to the max
|
|
break;
|
|
default:
|
|
perceivedVolume = Mathf.Lerp(audio.volume, 0,
|
|
Mathf.Max(0, distanceToListener - audio.minDistance) / (audio.maxDistance - audio.minDistance));
|
|
// Not possible to deal with custom rolloffs since it's not accessible by script. Let's pretend it's linear.
|
|
break;
|
|
}
|
|
|
|
if (useClipAgePriority && !audio.loop) {
|
|
//Don't make looping sounds lessen in priority over time
|
|
perceivedVolume = Mathf.Lerp(perceivedVolume, perceivedVolume * 0.1f,
|
|
AudioUtil.GetAudioPlayedPercentage(audio) * .01f);
|
|
//Set the factor lower when this non-looping sound has played for a few seconds so that newer sounds get a slightly higher priority.
|
|
}
|
|
|
|
audio.priority = (int)Mathf.Lerp(HighestPriority, LowestPriority, Mathf.InverseLerp(1f, 0f, perceivedVolume));
|
|
// Transform our perceived volume from the [0...1] range to the [16...128] range so that the higher the perceived volume the lower the priority number.
|
|
}
|
|
}
|
|
}
|
|
/*! \endcond */ |