hellbound/Assets/Scripts/Managers/Sounds/Sound.cs

149 lines
3.8 KiB
C#

using System;
using UnityEngine;
using Object = UnityEngine.Object;
public static class Sound
{
private static SoundsManager _sounds;
private static AudioListener _listener;
private static bool _isMuted;
public static void Init()
{
DestroyExtraListeners();
LoadSounds();
}
private static void LoadSounds()
{
if(_sounds == null)
_sounds = Assets.CreateImmortal<SoundsManager>("Main/SoundsManager");
_listener = _sounds.gameObject.GetComponent<AudioListener>();
}
private static void DestroyExtraListeners()
{
AudioListener[] existListeners = Object.FindObjectsOfType<AudioListener>();
if(existListeners.Length > 0)
foreach (AudioListener existListener in existListeners)
Object.Destroy(existListener);
}
public static void Mute()
{
_isMuted = true;
_listener.enabled = !_isMuted;
}
public static void Unmute()
{
_isMuted = false;
_listener.enabled = !_isMuted;
}
public static bool IsPlaying(string soundName)
{
SoundClip s = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if (s == null)
throw new Exception($"Sound {soundName} not found!");
return s.Source.isPlaying;
}
public static void SetPitch(string soundName, float pitch)
{
SoundClip s = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if (s == null)
throw new Exception($"Sound {soundName} not found!");
s.Source.pitch = pitch;
}
public static float GetVolume(string soundName)
{
SoundClip s = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if (s == null)
throw new Exception($"Sound {soundName} not found!");
return s.volume;
}
public static void SetVolume(string soundName, float value)
{
SoundClip clip = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if (clip == null)
throw new Exception($"Sound {soundName} not found!");
clip.Source.volume = value;
}
public static void SetVolume(SoundClip soundClip, float value)
{
if (soundClip == null)
throw new Exception($"Sound not found!");
soundClip.Source.volume = value;
}
public static void Play(string soundName)
{
SoundClip clip = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if(clip == null)
throw new Exception($"Sound {soundName} not found!");
if (clip.disabled)
return;
clip.Source.Play();
}
/// <summary>
/// Play random sound named soundNameN, where N random between 1 and variationsCount.
/// </summary>
/// <param name="soundName">Base name of sound</param>
/// <param name="variationsCount">Suffix index</param>
public static void PlayRandomBySuffix(string soundName, int variationsCount)
{
int suffix = UnityEngine.Random.Range(1, variationsCount);
var fullName = $"{soundName}{suffix}";
SoundClip s = Array.Find(_sounds.Clips, sound => sound.name == fullName);
if(s == null)
throw new Exception($"Sound {fullName} not found!");
if (s.disabled)
return;
s.Source.Play();
}
public static void Stop(string soundName)
{
SoundClip s = Array.Find(_sounds.Clips, sound => sound.name == soundName);
if (s == null)
{
Debug.LogWarning($"Sound {soundName} not found!");
return;
}
s.Source.Stop();
}
public static void StopAll()
{
foreach (SoundClip s in _sounds.Clips)
{
if(s.Source.isPlaying)
s.Source.Stop();
}
}
}