You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.6 KiB
130 lines
3.6 KiB
using UnityEngine; |
|
using System.Collections.Generic; |
|
|
|
public class SoundsManager : MonoBehaviour |
|
{ |
|
private static SoundsManager m_instance = null; |
|
|
|
List<AudioSource> m_audioSourses = new List<AudioSource>(); |
|
bool m_inited = false; |
|
Dictionary<string, AudioClip> m_loadedAudioClips = new Dictionary<string, AudioClip>(); |
|
|
|
//------------------------------------------------------------------ |
|
public static SoundsManager Instance |
|
{ |
|
get { return m_instance; } |
|
} |
|
|
|
//------------------------------------------------------------------ |
|
void Init () |
|
{ |
|
m_instance = this; |
|
AudioSource[] allAudioSources = GetComponents<AudioSource>(); |
|
for (int i = 0; i < allAudioSources.Length; ++i) |
|
m_audioSourses.Add(allAudioSources[i]); |
|
|
|
SetVolume(1f); |
|
m_inited = true; |
|
|
|
DontDestroyOnLoad(this); |
|
} |
|
//------------------------------------------------------------------ |
|
public void SetVolume( float volumeValue ) |
|
{ |
|
for ( int i = 0; i < m_audioSourses.Count; ++i ) |
|
m_audioSourses[i].volume = volumeValue; |
|
} |
|
//------------------------------------------------------------------ |
|
public AudioSource PlaySound( string soundName, float delay = 0f, bool needLoop = false, float volume = 0.6f ) |
|
{ |
|
if (!GlobalsVar.gNeedPlaySounds) |
|
return null; |
|
|
|
int count = GetPlayedSoundCount(soundName); |
|
if (count > 1) |
|
return null; |
|
|
|
string filePath = "Sounds/" + soundName; |
|
AudioClip clip = null; |
|
if (m_loadedAudioClips.ContainsKey(soundName)) |
|
clip = m_loadedAudioClips[soundName]; |
|
|
|
if (!clip) |
|
{ |
|
clip = Resources.Load<AudioClip>(filePath); |
|
m_loadedAudioClips[soundName] = clip; |
|
} |
|
|
|
if (clip) |
|
{ |
|
AudioSource audioSource = GetFreeAudioSource(); |
|
if (audioSource) |
|
{ |
|
audioSource.volume = volume; |
|
audioSource.clip = clip; |
|
audioSource.loop = needLoop; |
|
|
|
if (delay > 0f) |
|
audioSource.PlayDelayed(delay); |
|
else |
|
audioSource.Play(); |
|
|
|
return audioSource; |
|
} |
|
else |
|
{ |
|
CommonFunctions.myassert(false); |
|
return null; |
|
} |
|
} |
|
else |
|
CommonFunctions.myassert(false, soundName + "sound not found"); |
|
|
|
return null; |
|
} |
|
|
|
//------------------------------------------------------------------ |
|
int GetPlayedSoundCount(string name) |
|
{ |
|
int soundCount = 0; |
|
foreach (AudioSource audioSource in m_audioSourses) |
|
{ |
|
if (audioSource.isPlaying && audioSource.clip.name == name) |
|
soundCount++; |
|
} |
|
|
|
return soundCount; |
|
} |
|
|
|
//------------------------------------------------------------------ |
|
AudioSource GetFreeAudioSource() |
|
{ |
|
foreach ( AudioSource audioSource in m_audioSourses ) |
|
{ |
|
if (audioSource.isPlaying) |
|
continue; |
|
|
|
return audioSource; |
|
} |
|
|
|
CommonFunctions.myassert(false, ""); |
|
return null; |
|
} |
|
|
|
//------------------------------------------------------------------ |
|
public void StopAllSounds() |
|
{ |
|
foreach (AudioSource audioSource in m_audioSourses) |
|
{ |
|
if (audioSource.isPlaying) |
|
audioSource.Stop(); |
|
} |
|
} |
|
|
|
//------------------------------------------------------------------ |
|
public void Update () |
|
{ |
|
if (!m_inited) |
|
Init(); |
|
} |
|
}
|
|
|