这从我司主程周峰那复制来的audiomanager.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class AudioManager : MonoBehaviour
{
#region Singleton Prep
static AudioManager _instance = null;
public static AudioManager Instance
{
get
{
if (_instance == null)
{
GameObject go = new GameObject("__AudioManager");
_instance = go.AddComponent<AudioManager>();
_instance.LoadAudioSource();
// DontDestroyOnLoad(go);
}
return _instance;
}
}
static bool SetInstance(AudioManager inst)
{
if (_instance != null && _instance != inst)
{
return false;
}
_instance = inst;
return true;
}
void OnEnable()
{
if (!SetInstance(this))
{
Debug.LogWarning("Same Instance :" + name);
DestroyImmediate(this);
return;
}
//DontDestroyOnLoad(gameObject);
}
#endregion
//
public enum AudioType
{
sfx,//普通音效
vfx,//人声音效
envm,//环境音效
bg//背景音乐
}
public const int SourceNumber = 8;
public const int ImportantSourceNumber = 4;
private AudioSource[] SfxSources;
private AudioSource[] SfxSourcesImportant;
private AudioSource VfxSource;
private AudioSource MusicSource;
private AudioSource EnvmSource;
private bool[] isPause ; // to judge if a audioclip is paused..
private float MusicVolume;
private float SfxVolume;
private float EnvmVolume;
private Dictionary<string, AudioClip> Clips = new Dictionary<string, AudioClip>();
void LoadAudioSource()
{
// Debug.Log("LoadAudioSource");
GameObject o = new GameObject("audioSource");
AudioSource audioSource = o.AddComponent<AudioSource>();
audioSource.playOnAwake = false;
SfxSources = new AudioSource[SourceNumber];
isPause = new bool[SourceNumber];
for(int i = 0; i < SfxSources.Length; ++i)
{
GameObject sourceObj = GameObject.Instantiate(o) as GameObject;
isPause[i] = false;
sourceObj.name += "_sfx";
SfxSources[i] = sourceObj.GetComponent<AudioSource>();
}
SfxSourcesImportant = new AudioSource[ImportantSourceNumber];
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
GameObject sourceObj = GameObject.Instantiate(o) as GameObject;
sourceObj.name += "_sfx";
SfxSourcesImportant[i] = sourceObj.GetComponent<AudioSource>();
}
GameObject vfxSourceObj = GameObject.Instantiate(o) as GameObject;
vfxSourceObj.name += "_vfx";
VfxSource = vfxSourceObj.GetComponent<AudioSource>();
GameObject musicSourceObj = GameObject.Instantiate(o) as GameObject;
musicSourceObj.name += "_bg";
MusicSource = musicSourceObj.GetComponent<AudioSource>()??musicSourceObj.AddComponent<AudioSource>();
GameObject envmSourceObj = GameObject.Instantiate(o) as GameObject;
envmSourceObj.name += "_envm";
EnvmSource = envmSourceObj.GetComponent<AudioSource>();
//
sfxVolume = musicVolume = envmVolume
#if UNITY_EDITOR
//= 0;
= 1;
#else
=1;
#endif
}
public void OnPause() // lyladd
{
for (int i = 0; i < SfxSources.Length; ++i)
{
if (SfxSources[i] != null && SfxSources[i].isPlaying)
{
isPause[i] = true;
SfxSources[i].Pause();
}
}
}
public void OnResume() //lyladd
{
for (int i = 0; i < SfxSources.Length; ++i)
{
// if (SfxSources[i] != null && !SfxSources[i].isPlaying)
if(isPause[i])
{
isPause[i] = false;
SfxSources[i].Play();
}
}
}
public bool PlayClip(string clipName, AudioType sourceType, bool bLoop, bool force = false)
{
if(!Clips.ContainsKey(clipName))
{
AudioClip clip = Resources.Load("Audios/" + clipName) as AudioClip;
Clips.Add(clipName, clip);
}
if (Clips[clipName] == null)
{
// Debug.LogError("Not found audio clip " + clipName);
return false;
}
return PlayClip(Clips[clipName], sourceType, bLoop, force);
}
public bool IsPlaying(string clipName, AudioType sourceType)
{
if(!Clips.ContainsKey(clipName))
{
return false;
}
return IsPlaying(Clips[clipName], sourceType);
}
public bool StopClip(string clipName)
{
if(!Clips.ContainsKey(clipName))
{
return false;
}
if (Clips[clipName] == null)
{
Debug.LogWarning("cant find clip, the object may be destroyed.");
return false;
}
return StopClip(Clips[clipName]);
}
public bool PlayClip(AudioClip clip, AudioType sourceType, bool bLoop, bool force = false)
{
if(sourceType == AudioType.sfx)
{//sfx.
bool played = false;
for(int i = 0; i < SfxSources.Length; ++i)
{
if (SfxSources[i]==null)
continue;
if(SfxSources[i].clip != null && SfxSources[i].isPlaying)
{
continue;
}
SfxSources[i].loop = bLoop;
SfxSources[i].clip = clip;
SfxSources[i].Play();
played = true;
return true;
}
if(!played&&force)
{
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
if(SfxSourcesImportant[i]==null)
continue;
if (SfxSourcesImportant[i].clip != null && SfxSourcesImportant[i].isPlaying)
{
continue;
}
SfxSourcesImportant[i].loop = bLoop;
SfxSourcesImportant[i].clip = clip;
SfxSourcesImportant[i].Play();
played = true;
return true;
}
}
}
else if (sourceType == AudioType.vfx)
{//vfx
if (VfxSource!=null&&!VfxSource.isPlaying)
{
VfxSource.loop = bLoop;
VfxSource.clip = clip;
VfxSource.Play();
}
return true;
}
else if(sourceType == AudioType.bg)
{//bg music.
if((MusicSource!=null&&!MusicSource.isPlaying) || MusicSource.clip != clip)
{
MusicSource.loop = bLoop;
MusicSource.clip = clip;
MusicSource.Play();
}
return true;
}
else if (sourceType == AudioType.envm)
{//bg effect.
if ((EnvmSource!=null&&!EnvmSource.isPlaying) || EnvmSource.clip != clip)
{
EnvmSource.loop = bLoop;
EnvmSource.clip = clip;
EnvmSource.Play();
}
return true;
}
return false;
}
public bool IsPlaying(AudioClip clip, AudioType sourceType)
{
if (sourceType == AudioType.sfx)
{//sfx.
for (int i = 0; i < SfxSources.Length; ++i)
{
if (SfxSources[i]!=null&&SfxSources[i].clip == clip && SfxSources[i].isPlaying)
{
return true;
}
}
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
if (SfxSourcesImportant[i]!=null&&SfxSourcesImportant[i].clip == clip && SfxSourcesImportant[i].isPlaying)
{
return true;
}
}
}
else if (sourceType == AudioType.vfx && VfxSource.clip == clip)
{
return VfxSource.isPlaying;
}
else if (sourceType == AudioType.envm && EnvmSource.clip == clip)
{
return EnvmSource.isPlaying;
}
else if (sourceType == AudioType.bg && MusicSource.clip == clip)
{//bg music.
return MusicSource.isPlaying;
}
return false;
}
public bool StopClip(AudioClip clip) {
if (MusicSource!=null&&MusicSource.clip != null && MusicSource.clip.Equals(clip) && MusicSource.isPlaying)
{
MusicSource.Stop();
return true;
}
if (EnvmSource!=null&&EnvmSource.clip != null && EnvmSource.clip.Equals(clip) && EnvmSource.isPlaying)
{
EnvmSource.Stop();
return true;
}
if (VfxSource!=null&&VfxSource.clip != null && VfxSource.clip.Equals(clip) && VfxSource.isPlaying)
{
VfxSource.Stop();
return true;
}
for(int i = 0; i < SfxSources.Length; ++i)
{
if(SfxSources[i]!=null&&SfxSources[i].clip != null && SfxSources[i].clip.Equals(clip) && SfxSources[i].isPlaying)
{
SfxSources[i].Stop();
return true;
}
}
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
if (SfxSourcesImportant[i]!=null&&SfxSourcesImportant[i].clip != null && SfxSourcesImportant[i].clip.Equals(clip) && SfxSourcesImportant[i].isPlaying)
{
SfxSourcesImportant[i].Stop();
return true;
}
}
return false;
}
public void ClearClip()
{
if(MusicSource != null)
{
if(MusicSource.clip != null)
{
MusicSource.Stop();
}
MusicSource.transform.parent = null;
GameObject.Destroy(MusicSource);
}
if (EnvmSource != null)
{
if (EnvmSource.clip != null)
{
EnvmSource.Stop();
}
EnvmSource.transform.parent = null;
GameObject.Destroy(EnvmSource);
}
if (VfxSource != null)
{
if (VfxSource.clip != null)
{
VfxSource.Stop();
}
VfxSource.transform.parent = null;
GameObject.Destroy(VfxSource);
}
//
if(SfxSources != null) {
for(int i = 0; i < SfxSources.Length; ++i) {
if(SfxSources[i] == null)
continue;
if(SfxSources[i].clip != null) {
SfxSources[i].Stop();
}
SfxSources[i].transform.parent = null;
GameObject.Destroy(SfxSources[i]);
}
}
if (SfxSourcesImportant != null)
{
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
if (SfxSourcesImportant[i] == null)
continue;
if (SfxSourcesImportant[i].clip != null)
{
SfxSourcesImportant[i].Stop();
}
SfxSourcesImportant[i].transform.parent = null;
GameObject.Destroy(SfxSourcesImportant[i]);
}
}
//
Clips.Clear();
LoadAudioSource();
}
public void SetEnvmOn(bool on)
{
Debug.Log("SetEnvmOn " + on);
if (!on)
EnvmSource.volume = 0;
else
EnvmSource.volume = envmVolume;
}
public void SetMusicOn(bool on)
{
Debug.Log("SetMusicOn "+ on);
if(!on)
MusicSource.volume = 0;
else
MusicSource.volume = musicVolume;
}
public void SetSfxOn(bool on)
{
Debug.Log("SetSfxOn "+ on);
if(!on) {
for(int i = 0; i < SfxSources.Length; ++i)
{
SfxSources[i].volume = 0;
}
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
SfxSourcesImportant[i].volume = 0;
}
NGUITools.soundVolume = 0;
VfxSource.volume = 0;
}
else {
for(int i = 0; i < SfxSources.Length; ++i) {
SfxSources[i].volume = sfxVolume;
}
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
SfxSourcesImportant[i].volume = sfxVolume;
}
NGUITools.soundVolume = 1;
VfxSource.volume = 1;
}
}
public float envmVolume
{
get
{
return EnvmVolume;
}
set
{
EnvmVolume = value;
EnvmSource.volume = EnvmVolume;
}
}
public float musicVolume {
get {
return MusicVolume;
}
set {
MusicVolume = value;
MusicSource.volume = MusicVolume;
}
}
public float sfxVolume
{
get
{
return SfxVolume;
}
set {
SfxVolume = value;
for(int i = 0; i < SfxSources.Length; ++i) {
SfxSources[i].volume = SfxVolume;
}
for (int i = 0; i < SfxSourcesImportant.Length; ++i)
{
SfxSourcesImportant[i].volume = SfxVolume;
}
VfxSource.volume = SfxVolume;
}
}
}