diff --git a/Runtime/Scripts/AudioManagerInternal.cs b/Runtime/Scripts/AudioManagerInternal.cs index c42ee63..d3d9eaa 100644 --- a/Runtime/Scripts/AudioManagerInternal.cs +++ b/Runtime/Scripts/AudioManagerInternal.cs @@ -841,22 +841,22 @@ public void LoadAudioLibrary(AudioLibrary l) var newLib = new LoadedLibrary { Library = l, Users = 1 }; List enums = new List(); - var soundType = l.soundEnumGenerated; + var soundTypeName = l.soundEnumGenerated; if (!l.soundNamespaceGenerated.IsNullEmptyOrWhiteSpace()) { - soundType = l.soundNamespaceGenerated + "." + soundType; + soundTypeName = l.soundNamespaceGenerated + "." + soundTypeName; } - var assembly = soundType + ", Assembly-CSharp"; - Type enumType = Type.GetType(assembly); + Type enumType = FindEnumType(soundTypeName); + enums.AddRange(Enum.GetNames(enumType)); newLib.SoundKeys = new long[enums.Count]; for (int i = 0; i < l.Sounds.Count; i++) { l.Sounds[i].Initialize(); - var soundName = soundType + "." + enums[i]; + var soundName = soundTypeName + "." + enums[i]; long key = ComputeEnumHash(enumType, i); newLib.SoundKeys[i] = key; audioFileLookup.Add(soundName, l.Sounds[i]); @@ -864,21 +864,21 @@ public void LoadAudioLibrary(AudioLibrary l) } enums.Clear(); - var musicType = l.musicEnumGenerated; + var musicTypeName = l.musicEnumGenerated; if (!l.musicNamespaceGenerated.IsNullEmptyOrWhiteSpace()) { - musicType = l.musicNamespaceGenerated + "." + musicType; + musicTypeName = l.musicNamespaceGenerated + "." + musicTypeName; } - assembly = musicType + ", Assembly-CSharp"; - - enumType = Type.GetType(assembly); + + enumType = FindEnumType(musicTypeName); + enums.AddRange(Enum.GetNames(enumType)); newLib.MusicKeys = new long[enums.Count]; for (int i = 0; i < l.Music.Count; i++) { - var musicName = musicType + "." + enums[i]; + var musicName = musicTypeName + "." + enums[i]; long key = ComputeEnumHash(enumType, i); newLib.MusicKeys[i] = key; audioFileLookup.Add(musicName, l.Music[i]); @@ -932,5 +932,19 @@ private static int GetEnumUnderlyingValue(T e) where T : Enum { return unchecked(UnsafeUtility.As(ref e)); } + + private Type FindEnumType(string soundType) + { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + var type = assembly.GetType(soundType); + if (type != null && type.IsEnum) + { + return type; + } + } + + throw new InvalidOperationException($"Enum type '{soundType}' was not found in loaded assemblies."); + } } } \ No newline at end of file diff --git a/Runtime/Scripts/BaseAudioChannelHelper.cs b/Runtime/Scripts/BaseAudioChannelHelper.cs index 64f9223..7c62127 100644 --- a/Runtime/Scripts/BaseAudioChannelHelper.cs +++ b/Runtime/Scripts/BaseAudioChannelHelper.cs @@ -275,12 +275,24 @@ public virtual AudioSource Play() if (JSAMSettings.Settings.Spatialize && audioFile.spatialize) { + if (JSAMSettings.Settings.globalRolloffCurveOverride) + { + AudioSource.rolloffMode = AudioRolloffMode.Custom; + AudioSource.SetCustomCurve(AudioSourceCurveType.CustomRolloff, JSAMSettings.Settings.rolloffCurveOverride); + } + else + { + AudioSource.rolloffMode = AudioRolloffMode.Logarithmic; + } + AudioSource.spatialBlend = 1; if (audioFile.maxDistance != 0) { AudioSource.maxDistance = audioFile.maxDistance; } else AudioSource.maxDistance = JSAMSettings.Settings.DefaultSoundMaxDistance; + + AudioSource.spread = JSAMSettings.Settings.DefaultSpread; } else { diff --git a/Runtime/Scripts/JSAMSettings.cs b/Runtime/Scripts/JSAMSettings.cs index 25dd57f..1b5c2c5 100644 --- a/Runtime/Scripts/JSAMSettings.cs +++ b/Runtime/Scripts/JSAMSettings.cs @@ -31,6 +31,11 @@ public class JSAMSettings : ScriptableObject [SerializeField] float defaultSoundMaxDistance = 7; public float DefaultSoundMaxDistance => defaultSoundMaxDistance; + [Tooltip("Spread for 3D spatialized audio")] + [SerializeField] float defaultSpread = 0f; + + public float DefaultSpread => defaultSpread; + [Tooltip("Affects how AudioClip lists are displayed in FileObject inspectors. " + "Toggle this option if you're experiencing issues manipulating Audio Clips in the inspector")] [SerializeField] bool useBuiltInAudioListRenderer = @@ -161,7 +166,12 @@ public enum SpatializeUpdateMode [SerializeField] string voiceMutedKey = "JSAM_VOICE_MUTE"; public string VoiceVolumeKey => voiceVolumeKey; public string VoiceMutedKey => voiceMutedKey; - + + [SerializeField] + public bool globalRolloffCurveOverride = false; + [SerializeField] + public AnimationCurve rolloffCurveOverride = new AnimationCurve(new Keyframe(0, 1), new Keyframe(1, 0)); + [Tooltip("The font size used when rendering \"quick reference guides\" in JSAM editor windows")] [SerializeField] int quickReferenceFontSize = 10; public int QuickReferenceFontSize