Unity实现音频播放管理器

本文实例为大家分享了Unity实现音频播放管理器的具体代码,供大家参考,具体内容如下

1、模块化,直接用。创建一个空物体,把此脚本拖上去,然后把需要播放的所有音频拖到面板上的”AudioList“中;

2、通过AudioManagerP._instance直接调用方法,包含:

  • 暂停;
  • 继续播放;
  • 停止播放;
  • 播放背景音乐(0号播放器专用于播放背景音);
  • 直接播放声音(带参数1、播放器序号  2、音频的名字    3、声音大小    4、   是否循环);
  • 直接播放呻吟(带参数1、播放器序号  2、音频的名字);
  • 声音淡入(带参数1、播放器序号  2、音频的名字    3、 是否循环);
  • 声音淡出(带参数  播放器序号 )。

优点:同时可以播放很多个声音源,可以精确控制每个播放源的状态

缺点:不知道。

源码

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class AudioManagerP : MonoBehaviour

{

public static AudioManagerP _instance;//单例

private bool isOut;

private bool isIn;

void Awake()

{

_instance = this;

DontDestroyOnLoad(this);

}

//audioClipl列表

public List<AudioClip> audioList;

//初始声音预设数量

private int initAudioPrefabcount = 7;

//记录静音前的音量大小

[HideInInspector]

public float tempVolume = 0;

//是否静音

private bool isMute = false;

public bool IsMute

{

set

{

isMute = value;

if (isMute)

{

tempVolume = AudioListener.volume;

AudioListener.volume = 0;

}

else

{

AudioListener.volume = tempVolume;

}

}

private get { return isMute; }

}

//声音大小系数

private float volumeScale = 1;

public float VolumeScale

{

set

{

volumeScale = Mathf.Clamp01(value);

if (!IsMute)

{

AudioListener.volume = value;

}

}

private get { return volumeScale; }

}

//audio字典

private Dictionary<string, AudioClip> audioDic = new Dictionary<string, AudioClip>();

//背景音乐

private AudioSource bgAudioSource;

//声音对象池

private AudioObjectPool audioObjectPool;

private void Start()

{

GameObject audioPrefab = new GameObject("AudioObjectPool");

audioPrefab.AddComponent<AudioSource>();

audioPrefab.GetComponent<AudioSource>().playOnAwake = false;

audioObjectPool = new AudioObjectPool(audioPrefab, initAudioPrefabcount);

audioPrefab.hideFlags = HideFlags.HideInHierarchy;

audioPrefab.transform.SetParent(this.transform);

foreach (AudioClip ac in audioList)

{

audioDic.Add(ac.name, ac);

}

bgAudioSource = this.transform.GetChild(0).GetComponent<AudioSource>();

}

private void Update()

{

//测试代码

if (Input.GetMouseButtonDown(0))

{

//StartCoroutine(AudioFadeIn(0, "沈木-Sold Out(热播版)", true)); //音乐渐入

//PlayAudio(0, "沈木-Sold Out(热播版)"); //直接播放

}

if (Input.GetMouseButtonDown(1))

{

//StartCoroutine(AudioFadedOut(0)); //音乐淡出

}

}

/// <summary>

/// 音频播放

/// </summary>

/// <param name="index">播放器序号(用第几个AudioSource播放)</param>

public void PauseAudio(int index)

{

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

audioSource.Pause();

}

/// <summary>

/// 继续播放

/// </summary>

/// <param name="index">播放器序号</param>

public void ResumeAudio(int index)

{

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

audioSource.UnPause();

}

/// <summary>

/// 停止播放声音

/// </summary>

/// <param name="index">播放器序号</param>

public void StopAudio(int index)

{

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

audioSource.Stop();

}

/// <summary>

/// 播放背景音乐,这里直接固定0号播放器用来播放北京音乐

/// </summary>

/// <param name="audioNme"></param>

public void PlayBGMAudio(string audioNme)

{

AudioClip audioClip;

if (audioDic.TryGetValue(audioNme, out audioClip))

{

bgAudioSource.gameObject.SetActive(true);

bgAudioSource.clip = audioClip;

this.transform.GetChild(0).gameObject.SetActive(true);

bgAudioSource.Play();

bgAudioSource.loop = true;

}

}

/// <summary>

/// 直接播放声音

/// </summary>

/// <param name="index">播放器序号</param>

/// <param name="audioName">音频文件名称</param>

/// <param name="volume">音量大小</param>

/// <param name="isLoop">是否循环</param>

public void PlayAudio(int index, string audioName, float volume = 1, bool isLoop = false)

{

//Debug.Log("------------执行播放声音----------------");

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

if (IsMute || audioSource == null)

{

return;

}

StopAllCoroutines();

AudioClip audioClip;

if (audioDic.TryGetValue(audioName, out audioClip))

{

//Debug.Log("按钮点击的clip名字是:"+audioClip.name);

audioSource.gameObject.SetActive(true);

audioSource.loop = isLoop;

audioSource.clip = audioClip;

audioSource.volume = volume;

if (audioSource.isPlaying)

{

audioSource.Stop();

}

audioSource.Play();

}

}

/// <summary>

/// 重载播放,只有播放器和音频

/// </summary>

/// <param name="index">播放器序号</param>

/// <param name="audioName">音频的名称</param>

public void PlayAudio(int index, string audioName)

{

//Debug.Log("------------执行播放声音----------------");

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

if (IsMute || audioSource == null)

{

return;

}

StopAllCoroutines();

AudioClip audioClip;

if (audioDic.TryGetValue(audioName, out audioClip))

{

//Debug.Log("按钮点击的clip名字是:"+audioClip.name);

audioSource.gameObject.SetActive(true);

audioSource.clip = audioClip;

if (audioSource.isPlaying)

{

audioSource.Stop();

}

audioSource.Play();

}

}

/// <summary>

/// 声音淡入

/// </summary>

/// <param name="index">播放器序号</param>

/// <param name="audioName">音频名称</param>

/// <param name="isLoop">是否循环</param>

/// <returns></returns>

public IEnumerator AudioFadeIn(int index, string audioName, bool isLoop)

{

float initVolume = 0;

float preTime = 1.0f / 5; //渐变率

AudioClip audioClip;

if (audioDic.TryGetValue(audioName, out audioClip))

{

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

if (audioSource == null) yield break;

audioSource.gameObject.SetActive(true); //声音播放对象默认为false,播放时把对应的对象设为true

audioSource.clip = audioClip;

audioSource.volume = 0;

audioSource.loop = isLoop;

print("zhi 0");

if (audioSource.isPlaying)

{

audioSource.Stop();

}

audioSource.Play();

audioSource.volume = 0;

while (true)

{

initVolume += 1 * Time.deltaTime * preTime; //声音渐高

audioSource.volume = initVolume; //将渐高变量赋值给播放器音量

if (initVolume >= 1 - 0.02f) //如果很接近配置文件中的值,那么将其固定在配置文件中的值(最大值)

{

audioSource.volume = 1;

break;

}

yield return 1;

}

}

}

/// <summary>

/// 声音淡出

/// </summary>

/// <param name="index">淡出的播放器序号</param>

/// <returns></returns>

public IEnumerator AudioFadedOut(int index)

{

AudioSource audioSource = this.transform.GetChild(index).GetComponent<AudioSource>();

if (audioSource == null || audioSource.volume == 0 || audioSource == null)

{

yield break;

}

float initVolume = audioSource.volume;

float preTime = 1.0f / 5;

while (true)

{

initVolume += -1 * Time.deltaTime * preTime;

audioSource.volume = initVolume;

if (initVolume <= 0)

{

audioSource.volume = 0;

audioSource.Stop();

break;

}

yield return 1;

}

}

/// <summary>

/// 初始化音频

/// </summary>

/// <param name="audioSource"></param>

private void InitAudioSource(AudioSource audioSource)

{

if (audioSource == null)

{

return;

}

if (audioSource.isPlaying)

{

audioSource.Stop();

}

audioSource.playOnAwake = false;

audioSource.loop = false;

audioSource.volume = 1;

audioSource.clip = null;

audioSource.name = "AudioObjectPool";

}

private void Destroy()

{

StopAllCoroutines();

}

}

#region 声音对象池

/*声音对象池,待完善,可能存在同一时间多种声音源在播放,硬切或者播放完毕再切,无法判定是那种,无法准确释放AudioObjectPool

这里只是在开局使用对象池生成了指定个数的播放器,没有用到获取和释放播放器对象*/

public class AudioObjectPool

{

//要生成的对象池预设

private GameObject prefab;

//对象池列表

private List<GameObject> pool;

//构造函数

public AudioObjectPool(GameObject prefab, int initialSize)

{

this.prefab = prefab;

this.pool = new List<GameObject>();

for (int i = 0; i < initialSize; i++)

{

//进行初始化

AllLocateInstance();

}

}

//获取实例

public GameObject GetInstance()

{

if (pool.Count == 0)

{

//创建实例

}

GameObject instance = pool[0];

pool.RemoveAt(0);

instance.SetActive(true);

return instance;

}

//释放实力

public void ReleaseInstance(GameObject instance)

{

instance.SetActive(false);

pool.Add(instance);

}

//生成本地实力

private GameObject AllLocateInstance()

{

GameObject instance = (GameObject)GameObject.Instantiate(prefab);

instance.transform.SetParent(AudioManagerP._instance.transform);

instance.SetActive(false);

pool.Add(instance);

return instance;

}

}

#endregion

以上是 Unity实现音频播放管理器 的全部内容, 来源链接: utcz.com/z/311753.html

回到顶部