基于Unity3D的声音管理系统的实现
声音和音效在一个项目中是不可缺少的一部分,如下我将带领大家在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的声音管理系统的实现相关推荐
- springboot基于spring的宽带管理系统以及实现毕业设计源码250910
Springboot宽带管理系统 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.―企业的管理也从人工操作变 ...
- 基于JSP(java)图书管理系统的设计和实现(含源文件)
获取项目源文件,联系Q:1225467431,可指导毕设,课设 摘 要 伴随着互联网的蓬勃发展,人们已经不再满足于信息的浏览和发布,而是渴望着能够充分享受网络所带来的更加多的便利.掌握计算机知识和应用 ...
- 基于JSP的固定资产管理系统的研究与设计
陕 西 科 技 大 学 镐 京 学 院 毕业设计(论文)任务书 信息工程 系 电子信息工程 专业 信工081 班级 学生: 张XX 题目:基于JSP的固定资产管理系统的研究与设计 毕业设计(论 ...
- python基于Python的资产管理系统毕业设计-附源码201117
摘 要 现代企业管理越来越强调利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用.安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本.资产管理系统为企业提供 ...
- 基于MEGA8的声音CLICK模块
➤ 01设计背景 在 一分钟制版之后 PCB腐蚀设备中,对于加入的盐酸控制器,使用了舵机来驱动盐酸瓶玻璃开关栓由于连接器断裂而无法使用. 使用手工旋转,制作一个声音定时器可以给打开时间进行控制,来确定 ...
- c++new时赋初值_基于ssm的客户管理系统 - C_you_again
01 概述 一个简单的客户关系管理系统 管理用户的基本数据 客户的分配 客户的流失 已经客户的状态 02 技术 ssm + jdk1.8 + mysql5.4 03 运行环境 ecplice + jd ...
- python管理系统-基于Python实现用户管理系统
基于Python的用户管理小系统,包含文件读写操作,实现了用户信息注册和登录的简单功能. class userLogReg: """ Created on 2018.11 ...
- java图书馆管理系统_六天写出来的基于Swing的图书管理系统你不来吐槽一下?
前段时间学习完了MySQL和JDBC,想着自己做个东西实战一下,于是写了一个烂大街的图书管理系统...但好歹是自己一个人日夜兼程,硬着头皮做出来的还像样的东西,总结一手吧.看的人欢迎吐槽.我会从以下几 ...
- 若依(基于SpringBoot的权限管理系统)集成MobileIMSDK实现IM服务端的搭建
场景 若依(基于SpringBoot的权限管理系统)的快速搭建: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/111030441 ...
最新文章
- c#获取电脑硬件信息参数说明(主板篇 Win32_BaseBoard )
- 【数据挖掘知识点五】层次聚类方法的理解
- 【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)
- 数据库连接池的原理没你想得这么复杂
- App后台开发运维和架构实践学习总结(9)——三种常见的API设计错误及解决方案
- [转]ASP.NET面试题
- P5 周志华:“数据、算法、算力”,人工智能三要素在未来还要加上“知识”
- 使用iframe实现在pc端预览移动端页面的效果
- java判断是否能上网_用Java检测远程主机是否能被连接
- UVA1226 LA3997 Numerical surprises【大数】
- 打造自己的Android源码学习环境之六:运行Android模拟器
- ubuntu系统grub引导修复
- 苹果电脑上可以转化照片格式的几个小工具
- 求最大公约数代码 Java_java怎么求最大公约数?
- 49个excel常用技巧(一)
- 认识 Arduino 开发板
- ui sketch_如何在Sketch中设计汽车应用程序设计UI
- c枚举类型enum例题_c语言之枚举类型(enum)
- 输入一无符号整数,求所有数位上数字之和
- NVIDIA 为微软 Xbox One 游戏机发布 PhysX 支持
热门文章
- 回顾10年职业生涯,重新启航
- 联想微型计算机一体机b505,联想IdeaCentreB505一体机电脑外型不错,都说它配置很? 爱问知识人...
- android4.4 systrace,android – 在尝试使用KitKat在Moto X上使用systrace时获得’Permission denied(13)’...
- 功能性原生态农业大健康-李忠:健康中国智慧城市无锡举行
- 专有软件不是唯一!试试54款开源服务器软件[转]
- idea 设置本地动态库
- 【Java ASQ队列同步器实现原理】简单理解
- PLC远程监控在纺织机械上的应用
- XP系统忘记密码?第一篇-U深度PE系统
- jQuery中的append()和appendTo()方法