using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class AudioController : MonoBehaviour
{
public static AudioController Instance = null;
private Dictionary<string, int> AudioDictionary = new Dictionary<string, int>();
private const int MaxAudioCount = 10;
private const string ResourcePath = "Audio/";
private const string StreamingAssetsPath = "";
private AudioSource BGMAudioSource;
private AudioSource LastAudioSource;
#region Mono Function
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(this.gameObject);
}
else
{
if (Instance != this)
{
Destroy(transform.gameObject);
}
}
}
#endregion
/// <summary>
/// ����
/// </summary>
/// <param name="audioname"></param>
public void SoundPlay(string audioname, float volume = 1)
{
if (AudioDictionary.ContainsKey(audioname))
{
if (AudioDictionary[audioname] <= MaxAudioCount)
{
AudioClip sound = this.GetAudioClip(audioname);
if (sound != null)
{
StartCoroutine(this.PlayClipEnd(sound, audioname));
this.PlayClip(sound, volume);
AudioDictionary[audioname]++;
}
}
}
else
{
AudioDictionary.Add(audioname, 1);
AudioClip sound = this.GetAudioClip(audioname);
if (sound != null)
{
StartCoroutine(this.PlayClipEnd(sound, audioname));
this.PlayClip(sound, volume);
AudioDictionary[audioname]++;
}
}
}
/// <summary>
/// ��ͣ
/// </summary>
/// <param name="audioname"></param>
public void SoundPause(string audioname)
{
if (this.LastAudioSource != null)
{
this.LastAudioSource.Pause();
}
}
/// <summary>
/// ��ͣ������Ч����
/// </summary>
public void SoundAllPause()
{
AudioSource[] allsource = FindObjectsOfType<AudioSource>();
if (allsource != null && allsource.Length > 0)
{
for (int i = 0; i < allsource.Length; i++)
{
allsource[i].Pause();
}
}
}
/// <summary>
/// ֹͣ�ض�����Ч
/// </summary>
/// <param name="audioname"></param>
public void SoundStop(string audioname)
{
GameObject obj = this.transform.Find("audioname").gameObject;
if (obj != null)
{
Destroy(obj);
}
}
/// <summary>
/// ��������
/// </summary>
public void BGMSetVolume(float volume)
{
if (this.BGMAudioSource != null)
{
this.BGMAudioSource.volume = volume;
}
}
public void BGMSetVolume(Slider slidervolume)
{
Debug.Log(slidervolume.value);
if (this.BGMAudioSource != null)
{
this.BGMAudioSource.volume = slidervolume.value;
}
}
/// <summary>
/// ���ű�������
/// </summary>
/// <param name="bgmname"></param>
/// <param name="volume"></param>
public void BGMPlay(string bgmname, float volume = 1f)
{
BGMStop();
if (bgmname != null)
{
AudioClip bgmsound = this.GetAudioClip(bgmname);
if (bgmsound != null)
{
this.PlayLoopBGMAudioClip(bgmsound, volume);
}
}
}
/// <summary>
/// ��ͣ��������
/// </summary>
public void BGMPause()
{
if (this.BGMAudioSource != null)
{
this.BGMAudioSource.Pause();
}
}
/// <summary>
/// ֹͣ��������
/// </summary>
public void BGMStop()
{
if (this.BGMAudioSource != null && this.BGMAudioSource.gameObject)
{
Destroy(this.BGMAudioSource.gameObject);
this.BGMAudioSource = null;
}
}
/// <summary>
/// ���²���
/// </summary>
public void BGMReplay()
{
if (this.BGMAudioSource != null)
{
this.BGMAudioSource.Play();
}
}
#region ��Ч��Դ·��
enum eResType
{
AB = 0,
CLIP = 1
}
/// <summary>
/// ������Ч
/// </summary>
/// <param name="aduioname"></param>
/// <param name="type"></param>
/// <returns></returns>
private AudioClip GetAudioClip(string aduioname, eResType type = eResType.CLIP)
{
AudioClip audioclip = null;
switch (type)
{
case eResType.AB:
break;
case eResType.CLIP:
audioclip = GetResAudioClip(aduioname);
break;
default:
break;
}
return audioclip;
}
private IEnumerator GetAbAudioClip(string aduioname)
{
yield return null;
}
private AudioClip GetResAudioClip(string aduioname)
{
return Resources.Load(ResourcePath + aduioname) as AudioClip;
}
#endregion
#region ��������
/// <summary>
/// �������ֿ�����
/// </summary>
/// <param name="audioClip"></param>
/// <param name="volume"></param>
/// <param name="isloop"></param>
/// <param name="name"></param>
private void PlayBGMAudioClip(AudioClip audioClip, float volume = 1f, bool isloop = false, string name = null)
{
if (audioClip == null)
{
return;
}
else
{
GameObject obj = new GameObject(name);
obj.transform.parent = this.transform;
AudioSource LoopClip = obj.AddComponent<AudioSource>();
LoopClip.clip = audioClip;
LoopClip.volume = volume;
LoopClip.loop = true;
LoopClip.pitch = 1f;
LoopClip.Play();
this.BGMAudioSource = LoopClip;
}
}
/// <summary>
/// ����һ�εı�������
/// </summary>
/// <param name="audioClip"></param>
/// <param name="volume"></param>
/// <param name="name"></param>
private void PlayOnceBGMAudioClip(AudioClip audioClip, float volume = 1f, string name = null)
{
PlayBGMAudioClip(audioClip, volume, false, name == null ? "BGMSound" : name);
}
/// <summary>
/// ѭ�����ŵı�������
/// </summary>
/// <param name="audioClip"></param>
/// <param name="volume"></param>
/// <param name="name"></param>
private void PlayLoopBGMAudioClip(AudioClip audioClip, float volume = 1f, string name = null)
{
PlayBGMAudioClip(audioClip, volume, true, name == null ? "LoopSound" : name);
}
#endregion
#region ��Ч
/// <summary>
/// ������Ч
/// </summary>
/// <param name="audioClip"></param>
/// <param name="volume"></param>
/// <param name="name"></param>
private void PlayClip(AudioClip audioClip, float volume = 1f, string name = null)
{
if (audioClip == null)
{
return;
}
else
{
GameObject obj = new GameObject(name == null ? "SoundClip" : name);
obj.transform.parent = this.transform;
AudioSource source = obj.AddComponent<AudioSource>();
StartCoroutine(this.PlayClipEndDestroy(audioClip, obj));
source.pitch = 1f;
source.volume = volume;
source.clip = audioClip;
source.Play();
this.LastAudioSource = source;
}
}
/// <summary>
/// ��������Чɾ������
/// </summary>
/// <param name="audioclip"></param>
/// <param name="soundobj"></param>
/// <returns></returns>
private IEnumerator PlayClipEndDestroy(AudioClip audioclip, GameObject soundobj)
{
if (soundobj == null || audioclip == null)
{
yield break;
}
else
{
yield return new WaitForSeconds(audioclip.length * Time.timeScale);
Destroy(soundobj);
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
private IEnumerator PlayClipEnd(AudioClip audioclip, string audioname)
{
if (audioclip != null)
{
yield return new WaitForSeconds(audioclip.length * Time.timeScale);
AudioDictionary[audioname]--;
if (AudioDictionary[audioname] <= 0)
{
AudioDictionary.Remove(audioname);
}
}
yield break;
}
#endregion
}
非常方便,亲测可用
播放sound的时候就可以:
AudioController.Instance.SoundPlay("click");
播放bgm的时候就可以:
AudioController.Instance.BGMPlay("bg2");
所有音频放在resources下面的audio文件夹里即可,上述脚本有函数可以获得
private AudioClip GetResAudioClip(string aduioname)
{
return Resources.Load(ResourcePath + aduioname) as AudioClip;
}