可以自己做一个dll,
using System.Collections;
using System.Collections.Generic;using UnityEngine;
public class AudioController : MonoBehaviour
{
public static AudioController Instance = null;
private Dictionary<string, int> AudioDictionary = new Dictionary<string, int>();
private const int MaxAudioCount = 3;
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;
}
else
{
if (Instance != this)
{
Destroy(transform.gameObject);
}
}
}
#endregion
void Update()
{
if (transform.childCount == 1)
{
BGMSetVolume(1);
}
if (transform.childCount == 2)
{
BGMSetVolume(0.3f);
}
}
/// <summary>
/// 不可重音
/// </summary>
/// <param name="audioname">Audioname.</param>
bool OnlyOne(string audioname)
{
AudioSource[] ChildAudios = transform.GetComponentsInChildren<AudioSource>();
foreach (var item in ChildAudios)
{
if (item.gameObject.name == audioname)
{
return false;
}
}
return true;
}
/// <summary>
/// 播放
/// </summary>
/// <param name="audioname"></param>
public void SoundPlay(string audioname, float volume = 1)
{
if (!OnlyOne(audioname))
{
return;
}
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, sound.name);
AudioDictionary[audioname]++;
}
}
}
else
{
AudioDictionary.Add(audioname, 1);
AudioClip sound = this.GetAudioClip(audioname);
if (sound != null)
{
//StartCoroutine(this.PlayClipEnd(sound, audioname));
this.PlayClip(sound, volume, sound.name);
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)
{
if (transform.childCount > 1)
{
try
{
GameObject obj = this.transform.Find(audioname).gameObject;
Destroy(obj);
}
catch (System.Exception)
{
}
// 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;
}
}
/// <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 = AudioExtend.GetAudio(obj);
AudioExtend.SetClip(LoopClip, audioClip);
//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 = AudioExtend.GetAudio(obj);
AudioExtend.SetClip(source, audioClip);
PlaySchedule(source);
//AudioSource source = obj.AddComponent<AudioSource>();
//StartCoroutine(this.PlayClipEndDestroy(audioClip, obj));
PlayClipEndDestroy(source, obj);
source.pitch = 1f;
source.volume = volume;
//source.spatialBlend = 1;
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);
}
}
private void PlayClipEndDestroy(AudioSource source, GameObject obj)
{
source.OnComplete(() =>
{
Debug.Log("播放完成咯!");
AudioDictionary[obj.name]--;
if (AudioDictionary[obj.name] <= 0)
{
AudioDictionary.Remove(obj.name);
}
Destroy(obj);
});
}
/// <summary>
/// Plaies the schedule.播放进度
/// </summary>
/// <param name="source">Source.</param>
private void PlaySchedule(AudioSource source)
{
source.OnUpdate((v) =>
{
Debug.Log("播放进度:" + v);
});
}
/// <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
}
using UnityEngine;
public static class AudioExtend
{
/// <summary>
/// 获得一个音频播放器
/// </summary>
/// <param name="gameObject"></param>
/// <returns></returns>
public static AudioSource GetAudio(this GameObject gameObject, bool add = false)
{
AudioSource audio = null;
if (!add)
{
audio = gameObject.GetComponent<AudioSource>();
if (audio == null)
{
audio = gameObject.AddComponent<AudioSource>();
}
}
if (add)
{
audio = gameObject.AddComponent<AudioSource>();
}
return audio;
}
/// <summary>
/// 设置Clip
/// </summary>
/// <param name="audioSource"></param>
/// <returns></returns>
public static AudioSource SetClip(this AudioSource audioSource, AudioClip clip)
{
if (clip)
{
audioSource.clip = clip;
}
return audioSource;
}
/// <summary>
/// 获取音频事件驱动
/// </summary>
/// <param name="audioSource"></param>
/// <returns></returns>
private static AudioEventDriver GetEventDriver(this AudioSource audioSource)
{
AudioEventDriver AudioEventDriver = audioSource.gameObject.GetComponent<AudioEventDriver>();
if (AudioEventDriver == null)
{
AudioEventDriver = audioSource.gameObject.AddComponent<AudioEventDriver>();
}
return AudioEventDriver;
}
/// <summary>
/// 音频播放中回调
/// </summary>
/// <param name="audioSource"></param>
/// <param name="onUpdateEventHandler"></param>
/// <returns></returns>
public static AudioSource OnUpdate(this AudioSource audioSource, AudioEventDriver.OnUpdateEventHandler onUpdateEventHandler)
{
GetEventDriver(audioSource).OnUpdate(audioSource, onUpdateEventHandler);
return audioSource;
}
/// <summary>
/// 音频播放完成回调
/// </summary>
/// <param name="audioSource"></param>
/// <param name="onUpdateEventHandler"></param>
/// <returns></returns>
public static AudioSource OnComplete(this AudioSource audioSource, AudioEventDriver.OnCompleteEventHandler onCompleteEventHandler)
{
GetEventDriver(audioSource).OnComplete(audioSource, onCompleteEventHandler);
return audioSource;
}
}
using UnityEngine;
public class AudioEventDriver : MonoBehaviour
{
/// <summary>
/// 委托定义
/// </summary>
/// <param name="Percentage">百分比</param>
public delegate void OnUpdateEventHandler(float Percentage);
public delegate void OnCompleteEventHandler();
/// <summary>
/// 委托实例
/// </summary>
public AudioEventDriver.OnUpdateEventHandler onUpdate = null;
public AudioEventDriver.OnCompleteEventHandler onComplete = null;
private AudioSource audioSource = null;
/// <summary>
/// OnUpdate 驱动方法
/// </summary>
/// <param name="audioSource_"></param>
/// <param name="onUpdateEventHandler"></param>
public void OnUpdate(AudioSource audioSource_, AudioEventDriver.OnUpdateEventHandler onUpdateEventHandler)
{
onUpdate = onUpdateEventHandler;
audioSource = audioSource_;
}
public void OnComplete(AudioSource audioSource_, AudioEventDriver.OnCompleteEventHandler onCompleteEventHandler)
{
audioSource = audioSource_;
onComplete = onCompleteEventHandler;
}
private void Update()
{
//OnUpdate 驱动
if (onUpdate != null && audioSource != null)
{
if (audioSource.isPlaying)
{
onUpdate(audioSource.time / audioSource.clip.length);
}
}
//OnComplete 驱动
if (audioSource.time == audioSource.clip.length)
{
onComplete();
}
}
}