声音和音效在一个项目中是不可缺少的一部分,如下我将带领大家在Unity3D中实现一个简单的声音管理系统。功能如下:

1.利用对象池生成AudioSource对象;(对对象池不了解的童鞋,戳这里http://blog.csdn.net/YongshuangZhao/article/details/78462604)

2.开放一个统一的AudioMgr接口实现声音音量和开关的控制;

3.AduioMgr可跨场景使用。

代码如下:

AudioMgr管理声音类

所以声音都由此类生成

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;//声音对象池
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) {  AlllocateInstance();  }  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 (AudioMgr._instance.transform);instance.SetActive(false);  pool.Add(instance);  return instance;  }
}public class AudioMgr : MonoBehaviour
{//单例模式public static AudioMgr _instance;//audioClip列表public List<AudioClip> audioList;//初始声音预设数量public int initAudioPrefabCount=5;//记录静音前的音量大小[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 AudioObjectPool audioObjectPool;void Awake(){_instance = this;DontDestroyOnLoad (this);}void Start(){SceneManager.sceneUnloaded += scene => {StopAllCoroutines ();for (int i = 0; i < transform.childCount; i++) {if (transform.GetChild(i).hideFlags != HideFlags.HideInHierarchy) {InitAudioSource(transform.GetChild(i).GetComponent<AudioSource> ());audioObjectPool.ReleaseInstance (transform.GetChild(i).gameObject);}}};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);}}//暂停播放public void PauseAudio(AudioSource audioSource){audioSource.Pause ();}//继续播放public void ResumeAudio(AudioSource audioSource){audioSource.UnPause ();}//停止播放public void StopAudio(AudioSource audioSource){audioSource.Stop();}//播放声音public void PlayAudio(AudioSource audioSource, string audioName,float volume=1, bool isLoop = false){if (IsMute){return;}AudioClip audioClip;if (audioDic.TryGetValue(audioName, out audioClip)){audioSource.loop = isLoop;audioSource.clip = audioClip;audioSource.volume = volume;if (audioSource.isPlaying){audioSource.Stop();}audioSource.Play();}}public void PlayAudio(Vector3 audioPos, string audioName,float volume=1, bool isLoop = false){if (IsMute){return;}AudioClip audioClip;if (audioDic.TryGetValue(audioName, out audioClip)){GameObject audioGo = audioObjectPool.GetInstance();audioGo.transform.position = audioPos;audioGo.name = audioName;AudioSource audioSource = audioGo.GetComponent<AudioSource>();audioSource.clip = audioClip;audioSource.volume = volume;audioSource.loop = isLoop;audioSource.Play();StartCoroutine(DestroyAudioGo(audioSource, audioClip.length));}}//初始化AudioSourceprivate 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";}//销毁声音IEnumerator DestroyAudioGo(AudioSource audioSource, float delayTime){yield return new WaitForSeconds (delayTime);InitAudioSource (audioSource);audioObjectPool.ReleaseInstance (audioSource.gameObject);}void Destroy(){StopAllCoroutines ();}
}

客户端

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class AudioUI : MonoBehaviour {public static AudioUI _instance;//音量大小private Slider slider;//声音开关private Toggle toggle;void Awake(){_instance = this;}void Start(){slider = transform.Find ("Slider").GetComponent<Slider> ();toggle = transform.Find ("Toggle").GetComponent<Toggle> ();slider.onValueChanged.AddListener(value=>{AudioMgr._instance.VolumeScale=value;});toggle.onValueChanged.AddListener (bState => {AudioMgr._instance.IsMute = bState;});}void Update(){if (Input.GetMouseButtonDown (0)) {AudioMgr._instance.PlayAudio (transform.position, "audio");}}
}

运行结果如图



基于Unity3D的声音管理系统的实现相关推荐

  1. springboot基于spring的宽带管理系统以及实现毕业设计源码250910

    Springboot宽带管理系统 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.―企业的管理也从人工操作变 ...

  2. 基于JSP(java)图书管理系统的设计和实现(含源文件)

    获取项目源文件,联系Q:1225467431,可指导毕设,课设 摘 要 伴随着互联网的蓬勃发展,人们已经不再满足于信息的浏览和发布,而是渴望着能够充分享受网络所带来的更加多的便利.掌握计算机知识和应用 ...

  3. 基于JSP的固定资产管理系统的研究与设计

    陕 西 科 技 大 学 镐 京 学 院 毕业设计(论文)任务书 信息工程 系 电子信息工程 专业 信工081  班级 学生: 张XX 题目:基于JSP的固定资产管理系统的研究与设计    毕业设计(论 ...

  4. python基于Python的资产管理系统毕业设计-附源码201117

    摘 要 现代企业管理越来越强调利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用.安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本.资产管理系统为企业提供 ...

  5. 基于MEGA8的声音CLICK模块

    ➤ 01设计背景 在 一分钟制版之后 PCB腐蚀设备中,对于加入的盐酸控制器,使用了舵机来驱动盐酸瓶玻璃开关栓由于连接器断裂而无法使用. 使用手工旋转,制作一个声音定时器可以给打开时间进行控制,来确定 ...

  6. c++new时赋初值_基于ssm的客户管理系统 - C_you_again

    01 概述 一个简单的客户关系管理系统 管理用户的基本数据 客户的分配 客户的流失 已经客户的状态 02 技术 ssm + jdk1.8 + mysql5.4 03 运行环境 ecplice + jd ...

  7. python管理系统-基于Python实现用户管理系统

    基于Python的用户管理小系统,包含文件读写操作,实现了用户信息注册和登录的简单功能. class userLogReg: """ Created on 2018.11 ...

  8. java图书馆管理系统_六天写出来的基于Swing的图书管理系统你不来吐槽一下?

    前段时间学习完了MySQL和JDBC,想着自己做个东西实战一下,于是写了一个烂大街的图书管理系统...但好歹是自己一个人日夜兼程,硬着头皮做出来的还像样的东西,总结一手吧.看的人欢迎吐槽.我会从以下几 ...

  9. 若依(基于SpringBoot的权限管理系统)集成MobileIMSDK实现IM服务端的搭建

    场景 若依(基于SpringBoot的权限管理系统)的快速搭建: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/111030441 ...

最新文章

  1. c#获取电脑硬件信息参数说明(主板篇 Win32_BaseBoard )
  2. 【数据挖掘知识点五】层次聚类方法的理解
  3. 【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)
  4. 数据库连接池的原理没你想得这么复杂
  5. App后台开发运维和架构实践学习总结(9)——三种常见的API设计错误及解决方案
  6. [转]ASP.NET面试题
  7. P5 周志华:“数据、算法、算力”,人工智能三要素在未来还要加上“知识”
  8. 使用iframe实现在pc端预览移动端页面的效果
  9. java判断是否能上网_用Java检测远程主机是否能被连接
  10. UVA1226 LA3997 Numerical surprises【大数】
  11. 打造自己的Android源码学习环境之六:运行Android模拟器
  12. ubuntu系统grub引导修复
  13. 苹果电脑上可以转化照片格式的几个小工具
  14. 求最大公约数代码 Java_java怎么求最大公约数?
  15. 49个excel常用技巧(一)
  16. 认识 Arduino 开发板
  17. ui sketch_如何在Sketch中设计汽车应用程序设计UI
  18. c枚举类型enum例题_c语言之枚举类型(enum)
  19. 输入一无符号整数,求所有数位上数字之和
  20. NVIDIA 为微软 Xbox One 游戏机发布 PhysX 支持

热门文章

  1. 回顾10年职业生涯,重新启航
  2. 联想微型计算机一体机b505,联想IdeaCentreB505一体机电脑外型不错,都说它配置很? 爱问知识人...
  3. android4.4 systrace,android – 在尝试使用KitKat在Moto X上使用systrace时获得’Permission denied(13)’...
  4. 功能性原生态农业大健康-李忠:健康中国智慧城市无锡举行
  5. 专有软件不是唯一!试试54款开源服务器软件[转]
  6. idea 设置本地动态库
  7. 【Java ASQ队列同步器实现原理】简单理解
  8. PLC远程监控在纺织机械上的应用
  9. XP系统忘记密码?第一篇-U深度PE系统
  10. jQuery中的append()和appendTo()方法