今天给大家分享下刚刚做的AudioManager

实现了以下功能:

1.同时播放一首背景音乐

2.同时播放N个音效

3.对象池管理AudioSource组件

4.背景音乐的声音淡入淡出

5.调整背景音乐的音量

6.调整音效的音量

7.本地缓存声音音量

8.切换场景不销毁

9.获取播放音效结束回调

10.播放3d音效

使用方法: 直接挂载到空物体上

应该是实现了大部分项目中需要的声音管理类的功能

下面为实现的代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using System;public class AudioManager : MonoBehaviour
{private static AudioManager instance;public static AudioManager Instance{get{return instance;}}private Dictionary<int, string> audioPathDict;      // 存放音频文件路径private AudioSource musicAudioSource;private List<AudioSource> unusedSoundAudioSourceList;   // 存放可以使用的音频组件private List<AudioSource> usedSoundAudioSourceList;     // 存放正在使用的音频组件private Dictionary<int, AudioClip> audioClipDict;       // 缓存音频文件private float musicVolume = 1;private float soundVolume = 1;private string musicVolumePrefs = "MusicVolume";private string soundVolumePrefs = "SoundVolume";private int poolCount = 3;         // 对象池数量void Awake(){DontDestroyOnLoad( this.gameObject );instance = this;audioPathDict = new Dictionary<int, string>()       // 这里设置音频文件路径。需要修改。 TODO{{ 1, "AudioClip/Music/MainMenuScene" },{ 2, "AudioClip/Music/BattleScene" },{ 11, "AudioClip/Sound/Sound1"},{ 12, "AudioClip/Sound/Sound2"},{ 13, "AudioClip/Sound/Sound3"},{ 14, "AudioClip/Sound/Sound4"},{ 15, "AudioClip/Sound/Sound5"},};musicAudioSource = gameObject.AddComponent<AudioSource>();unusedSoundAudioSourceList = new List<AudioSource>();usedSoundAudioSourceList = new List<AudioSource>();audioClipDict = new Dictionary<int, AudioClip>();}void Start(){// 从本地缓存读取声音音量if ( PlayerPrefs.HasKey( musicVolumePrefs ) ){musicVolume = PlayerPrefs.GetFloat( musicVolumePrefs );}if ( PlayerPrefs.HasKey( soundVolumePrefs ) ){musicVolume = PlayerPrefs.GetFloat( soundVolumePrefs );}}/// <summary>/// 播放背景音乐/// </summary>/// <param name="id"></param>/// <param name="loop"></param>public void PlayMusic( int id, bool loop = true ){// 通过Tween将声音淡入淡出DOTween.To( () => musicAudioSource.volume, value => musicAudioSource.volume = value, 0, 0.5f ).OnComplete( () =>{musicAudioSource.clip = GetAudioClip( id );musicAudioSource.clip.LoadAudioData();musicAudioSource.loop = loop;musicAudioSource.volume = musicVolume;musicAudioSource.Play();DOTween.To( () => musicAudioSource.volume, value => musicAudioSource.volume = value, musicVolume, 0.5f );} );}/// <summary>/// 播放音效/// </summary>/// <param name="id"></param>public void PlaySound( int id, Action action = null ){if ( unusedSoundAudioSourceList.Count != 0 ){AudioSource audioSource = UnusedToUsed();audioSource.clip = GetAudioClip( id );audioSource.clip.LoadAudioData();audioSource.Play();StartCoroutine( WaitPlayEnd( audioSource, action ) );}else{AddAudioSource();AudioSource audioSource = UnusedToUsed();audioSource.clip = GetAudioClip( id );audioSource.clip.LoadAudioData();audioSource.volume = soundVolume;audioSource.loop = false;audioSource.Play();StartCoroutine( WaitPlayEnd( audioSource, action ) );}}/// <summary>/// 播放3d音效/// </summary>/// <param name="id"></param>/// <param name="position"></param>public void Play3dSound( int id, Vector3 position ){AudioClip ac = GetAudioClip( id );AudioSource.PlayClipAtPoint( ac, position );}/// <summary>/// 当播放音效结束后,将其移至未使用集合/// </summary>/// <param name="audioSource"></param>/// <returns></returns>IEnumerator WaitPlayEnd( AudioSource audioSource, Action action ){yield return new WaitUntil( () => { return !audioSource.isPlaying; } );UsedToUnused( audioSource );if ( action != null ){action();}}/// <summary>/// 获取音频文件,获取后会缓存一份/// </summary>/// <param name="id"></param>/// <returns></returns>private AudioClip GetAudioClip( int id ){if ( !audioClipDict.ContainsKey( id ) ){if ( !audioPathDict.ContainsKey( id ) )return null;AudioClip ac = Resources.Load( audioPathDict[id] ) as AudioClip;audioClipDict.Add( id, ac );}return audioClipDict[id];}/// <summary>/// 添加音频组件/// </summary>/// <returns></returns>private AudioSource AddAudioSource(){if ( unusedSoundAudioSourceList.Count != 0 ){return UnusedToUsed();}else{AudioSource audioSource = gameObject.AddComponent<AudioSource>();unusedSoundAudioSourceList.Add( audioSource );return audioSource;}}/// <summary>/// 将未使用的音频组件移至已使用集合里/// </summary>/// <returns></returns>private AudioSource UnusedToUsed(){AudioSource audioSource = unusedSoundAudioSourceList[0];unusedSoundAudioSourceList.RemoveAt( 0 );usedSoundAudioSourceList.Add( audioSource );return audioSource;}/// <summary>/// 将使用完的音频组件移至未使用集合里/// </summary>/// <param name="audioSource"></param>private void UsedToUnused( AudioSource audioSource ){if ( usedSoundAudioSourceList.Contains( audioSource ) ){usedSoundAudioSourceList.Remove( audioSource );}if ( unusedSoundAudioSourceList.Count >= poolCount ){Destroy( audioSource );}else if ( audioSource != null && !unusedSoundAudioSourceList.Contains( audioSource ) ){unusedSoundAudioSourceList.Add( audioSource );}}/// <summary>/// 修改背景音乐音量/// </summary>/// <param name="volume"></param>public void ChangeMusicVolume( float volume ){musicVolume = volume;musicAudioSource.volume = volume;PlayerPrefs.SetFloat( musicVolumePrefs, volume );}/// <summary>/// 修改音效音量/// </summary>/// <param name="volume"></param>public void ChangeSoundVolume( float volume ){soundVolume = volume;for ( int i = 0; i < unusedSoundAudioSourceList.Count; i++ ){unusedSoundAudioSourceList[i].volume = volume;}for ( int i = 0; i < usedSoundAudioSourceList.Count; i++ ){usedSoundAudioSourceList[i].volume = volume;}PlayerPrefs.SetFloat( soundVolumePrefs, volume );}
}

调用方法

using UnityEngine;
using System.Collections;public class NewBehaviourScript : MonoBehaviour {// Use this for initializationvoid Start () {AudioManager.Instance.PlayMusic( 1 );AudioManager.Instance.PlaySound( 11, OnSoundPlayEnd );AudioManager.Instance.ChangeMusicVolume( 0.5f );AudioManager.Instance.ChangeSoundVolume( 0.5f );}void OnSoundPlayEnd(){Debug.Log( "音效播放完了" );}
}

声音管理AudioManager相关推荐

  1. Android声音管理AudioManager使用

    手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通过Android的SDK提供的声音管理接口来管理手机声音模式以及调整声音大小,这 ...

  2. 音效管理android,Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  3. android之声音管理器AudioManager的使用

    android之声音管理器AudioManager的使用 Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在And ...

  4. Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  5. Unity3d声音管理器AudioManager

    播放背景音乐.播放提示音.播放音效.成组播放.声音源复用.音量控制.音效播放位置等等. 写差不多了,发现不是自己想要的风格.没完善呢就过时的感觉.先放着吧... #if UNITY_EDITOR // ...

  6. 安卓声音管理器AudioManager的使用

    AudioManager是安卓sdk提供的声音管理接口,可以通过此接口管理手机声音模式声音.震动.静音等模式切换,也可以调节音量大小. 首先要获取声音管理器: AudioManager audioSe ...

  7. 关于Unity中的声音管理模块(专题七)

    声音的要素 1: 音频文件AudioClip 2: 音源AudioSource; 3: 耳朵AudioListener;//全局只能有一个 4: 2D/3D音频;//2D只是简单地播放声音,3D可以根 ...

  8. Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理

    Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理 在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变 ...

  9. 【Unity开发小技巧】AudioManager声音管理器

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群,行业纵横颇多,每个人精通领域各异,旨在交流, 在项目里做音频管理的时候,我们往往是跟资源管理结合起来的,但是这里我们就单音频管 ...

最新文章

  1. matplotlib 和 pandas 两个包的安装
  2. 3w最简单led灯电路图_12v延时关闭电路图大全
  3. 【机器学习PAI实践八】用机器学习算法评估学生考试成绩
  4. 用jsp实现登录界面
  5. 给妹子修电脑,会有哪些故事?
  6. mysql alert table 日志_MySQL日志
  7. linux7有相当于wget的,centos7安装mwget下载资源,提升下载速度
  8. Linux vi 双屏显示,manjaro AwesomeWM 上使用双显示器
  9. Zend Guard 7 , Zend Guard Loader处理PHP加密
  10. 关于博客园内嵌入bilibili视频
  11. 豆瓣上关于一万小时天才理论一书的一个评论
  12. 计算机研究生可以参加哪些比赛?
  13. php编写一个学生类_PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
  14. linux ruby作用域,Ruby 的作用域和作用域门
  15. lopatkin俄大神精简中文系统Windows 7 Professional SP1 7601.24540 x64 ZH-CN LITE10
  16. 苹果ID申请开发者 双重认证问题?
  17. 数据分析09|数据转换
  18. 公司数百人尽数被抓,只因旗下程序员写了这样一个爬虫!
  19. 2023Java 并发编程面试题
  20. 修改Excel时出现“被保护单元格不支持此功能“的解决办法

热门文章

  1. 有道云笔记转CSDN博客
  2. 电影版本名词解析 (CAM,TS,TC,DVDSCR,DVDRIP,HR-HDTV)
  3. 知识产权公证业务构成
  4. “提升业务决策效率:探索FICO Blaze决策引擎的应用“
  5. 程序员的工匠精神何在?何来?
  6. android联系人索引
  7. Spring入门到放弃篇(1)- Spring国际化
  8. Java国际化:BreakIterator
  9. 到底啥是分布式系统开发经验?
  10. 逻辑卷管理员(Logical Volume Manager)介绍