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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D实现播放gif图功能

    Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式.需要使用System.Drawing.dll.此dll在unity安装目录下就可以找到.由于unity没有gif格式的文件,所以我们无法在面板指定,需要动态加载.所以将gif图放在StreamingAssets文件夹下.以下为源代码: using System; using System.Collections; using System.Collections.Generic; using Syst

  • 在Unity中实现动画的正反播放代码

    using UnityEngine; using System.Collections; public class AnimationAntiSowing : MonoBehaviour { public static AnimationAntiSowing _initialise; void Awake() { _initialise = this; } /// <summary> /// 动画进行正反播放 /// </summary> /// <param name=&q

  • Unity实现鼠标或者手指点击模型播放动画

    本文实例为大家分享了unity鼠标或者手指点击模型播放动的具体代码,供大家参考,具体内容如下 using UnityEngine; using System.Collections; public class ClickPlayAnimation : MonoBehaviour { /// <summary> /// 实现功能为点击模型播放动画 /// 使用方法,给模型添加碰撞,添加脚本 /// </summary> bool isPlayAnim = false; // Use

  • Unity代码实现序列帧动画播放器

    序列帧动画经常用到,最直接的方式就是用Animation录制.但某些情况下这种方式并不是太友好,需要靠代码的方式进行序列帧动画的实现. 代码实现序列帧动画,基本的思路是定义一个序列帧的数组/列表,根据时间的流逝来确定使用哪一帧并更新显示. NGUI的UI2DSpriteAnimation已经实现了此功能,但是它支持的目标只有Native2D的SpriteRenderer组件或者NGUI自身的UI2DSprite组件,并不支持UGUI的Image组件. 当然可以通过改写源码的方式来添加对Image

  • Unity调取移动端的麦克风进行录音并播放

    本文实例为大家分享了Unity调取移动端的麦克风进行录音并播放的具体代码,供大家参考,具体内容如下 1.对MicroPhone类的理解 对麦克风的调用在Unity里主要是用到了MicroPhone这个类,此类里面有几个方法可以方便我们实现功能 2.代码演示 #region 模块信息 // ********************************************************************** // Copyright (C) 2018 Blazors // P

  • Unity实现音频播放管理器

    本文实例为大家分享了Unity实现音频播放管理器的具体代码,供大家参考,具体内容如下 1.模块化,直接用.创建一个空物体,把此脚本拖上去,然后把需要播放的所有音频拖到面板上的"AudioList"中: 2.通过AudioManagerP._instance直接调用方法,包含: 暂停: 继续播放: 停止播放: 播放背景音乐(0号播放器专用于播放背景音): 直接播放声音(带参数1.播放器序号  2.音频的名字    3.声音大小    4.   是否循环): 直接播放呻吟(带参数1.播放器

  • Android App中使用AudioManager类来编写音频播放器

    手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通过Android的SDK提供的声音管理接口来管理手机声音模式以及调整声音大小,这就是Android中AudioManager的使用. AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作   以下分别是AudioManager设置声音模式和调整声音大小的方法.     如何获取声音管理器: AudioManager audio

  • 实例解析使用Java实现基本的音频播放器的编写要点

    Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处理方面优势不大,或者说打从Java体系开发时就没太多的考虑音频播放因素,要知道最早的Java 1.1版本中,没有后来的javax.sound包,音频只能通过Applet包调取-- 遗憾的是,在图形程序开发中,我们的程序却又难免要使用到背景音乐.效果音等配合图像操作,哎,这实在是Sun大神给我们开的一个不打不小的玩笑.万幸后来Sun大神开眼,提供了javax.sound包,才解救我们于水深火热当中~ 但是继之而来的问题是,在javax.

  • iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南

    AudioServicesPlaySystemSound音频服务 对于简单的.无混音音频,AVAudio ToolBox框架提供了一个简单的C语言风格的音频服务.你可以使用AudioservicesPlaySystemSound函数来播放简单的声音.要遵守以下几个规则: 1.音频长度小于30秒 2.格式只能是PCM或者IMA4 3.文件必须被存储为.caf..aif.或者.wav格式 4.简单音频不能从内存播放,而只能是磁盘文件 除了对简单音频的限制外,你对于音频播放的方式也基本无法控制.一旦音

  • 如何利用Python实现简易的音频播放器

    目录 1.需要用到的Python库 2.简易UI设计 3.功能模块实现 3.1选择音频文件进行播放 3.2控制音频播放.暂停 3.3控制音频音量大小 3.4播放器初始化等细节 4.运行 5.简易音频播放器展示图 6.总结 1. 需要用到的Python库 pygame tkinter 2. 简易UI设计 audio_player = Tk() audio_player.title('Audio Player v1.0') audio_player.geometry('100x100+570+200

  • vue3中实现音频播放器APlayer的方法

    目录 前言: 官方: 实现步骤: 前言: vue2的时候,分享了一个很好用的插件是vue-aplayer,但是他是不支持vue3的,这里分享vue3使用APlayer来实现一个播放器的方法. 实现效果: 官方: git地址:点我 api地址:点我 实现步骤: 1.安装 npm: npm install aplayer --save Yarn: yarn add aplayer 2.页面中引入 import APlayer from 'APlayer'; import 'APlayer/dist/

  • Unity常用音频操作类示例代码

    下面通过代码给大家介绍Unity常用音频操作类,具体代码如下所示: using UnityEngine; using System.Collections; public class AudioPlay : MonoBehaviour { public static AudioPlay Instance; public AudioClip[] FuChuAudio; public AudioSource FCAudio; // public AudioSource BabyAudio; // U

  • Android音频焦点管理实例详解

    目录 音频焦点管理的意义 音频焦点管理的行为准则 版本兼容 在Android 8.0(API 26) 之前对音频焦点具体处理实现 8.0 之后实现 延迟获取焦点 自动降低音量 音频焦点请求方式 响应音频焦点更改 暂时性失去焦点 永久性失去焦点 附音频基础知识 总结 音频焦点管理的意义 两个或两个以上的 Android 应用可同时向同一输出流播放音频.系统会将所有音频流混合在一起.虽然这是一项出色的技术,但却会给用户带来很大的困扰.为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的

  • 使用javax.sound实现简单音频播放

    本文实例为大家分享了javax.sound实现简单音频播放的具体代码,供大家参考,具体内容如下 /** * @see * @author Al_assad yulinying_1994@outlook.com * @date 2016年11月17日 下午6:27:59 * @version V1.0 * Description: 简易音频播放器(只支持AU,RA,WAV) * 在不使用JMF的情况下快速实现音频播放 * */ import javax.sound.sampled.*; impor

  • HTML5视频播放标签video和音频播放标签audio标签的正确用法

    如何嵌入视频和音频 在网页里嵌入HTML5音频播放器和视频播放器的方法非常简单: <video src="//www.jb51.net/~j/theora_testsuite/320x240.ogg" controls autoplay loop> Your browser does not support the <code>video</code> element. </video> 上面这个例子显示了如何播放一个视频文件,并露出视频

随机推荐