U3D游戏开发框架(四)——音频管理器

news/2024/12/29 18:25:40/

一:目的

游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放可以分为两种,一种为游戏音乐,另一种为游戏音效。前者适用于较长的音乐,如游戏背景音乐。第二种适用于比较短的游戏音乐,如开枪瞬间的音效
在Unity中有两个关于音频的重要组件:AudioListener和AudioSource,通过AudioListener进行监听,AudioSource进行播放

所以我们需要一个管理器统一管理音频的相关操作


二:解决的问题及优点

——音效的播放、暂停、继续、静音
——背景音乐的播放、暂停、继续、静音、渐隐


三:使用方法

——将所有音频文件统一放在Resources文件夹下的Sounds文件夹下
——使用SoundMgr.Ins.XXX

SoundMgr.Ins.PlayBGM("bgm");
SoundMgr.Ins.PlaySound("coin");
SoundMgr.Ins.StopPlay();
SoundMgr.Ins.PausePlay();
SoundMgr.Ins.BGMFade(2);

四:代码实现

using UnityEngine;/// <summary>
/// 音频管理器
/// </summary>
public class SoundMgr : MonoSingleton<SoundMgr>
{public const string SoundDir = "Sounds/";//音频目录//BGM播放器private AudioSource bgmPlayer;public AudioSource BgmPlayer { get { return bgmPlayer; } }//音效播放器private AudioSource soundPlayer;public AudioSource SoundPlayer { get { return soundPlayer; } }//是否全局静音public bool IsGlobalMute { get { return bgmPlayer.mute && soundPlayer.mute; } }public override void Awake(){base.Awake();if (bgmPlayer == null){bgmPlayer = gameObject.AddComponent<AudioSource>();bgmPlayer.loop = true;bgmPlayer.playOnAwake = false;bgmPlayer.mute = false;}if (soundPlayer == null){soundPlayer = gameObject.AddComponent<AudioSource>();soundPlayer.loop = false;soundPlayer.playOnAwake = false;soundPlayer.mute = false;}}#region Interface/// <summary>/// 播放音效/// </summary>public void PlaySound(string soundName, float volume = 1, bool loop = false){AudioClip clip = Resources.Load<AudioClip>(SoundDir + soundName);if (clip == null){Debug.LogError("没有此音频:" + soundName);return;}soundPlayer.clip = clip;soundPlayer.volume = volume;soundPlayer.loop = loop;soundPlayer.Play();}/// <summary>/// 播放背景音乐/// </summary>public void PlayBGM(string bgmName, float volume = 1, bool loop = true){AudioClip clip = Resources.Load<AudioClip>(SoundDir + bgmName);if (clip == null){Debug.LogError("没有此音频:" + bgmName);return;}bgmPlayer.clip = clip;bgmPlayer.volume = volume;bgmPlayer.loop = loop;bgmPlayer.Play();}/// <summary>/// 背景音乐渐隐/// </summary>public void FadeBGM(float fadeDuration){bgmFade = true;bgmFadeBeginTime = Time.realtimeSinceStartup;bgmFadeBeginVolume = bgmPlayer.volume;bgmFadeDuration = fadeDuration;}/// <summary>/// 暂停播放/// </summary>public void PausePlay(){bgmPlayer.Pause();soundPlayer.Pause();}/// <summary>/// 继续播放/// </summary>public void ResumePlay(){bgmPlayer.Play();soundPlayer.Play();}/// <summary>/// 停止播放/// </summary>public void StopPlay(){bgmPlayer.Stop();soundPlayer.Stop();}/// <summary>/// 设置静音状态/// </summary>public void SetMuteState(bool b){bgmPlayer.mute = b;soundPlayer.mute = b;}/// <summary>/// 设置BGM静音状态/// </summary>public void SetBgmMuteState(bool b){bgmPlayer.mute = b;}/// <summary>/// 设置Sound静音状态/// </summary>public void SetSoundMuteState(bool b){soundPlayer.mute = b;}/// <summary>/// 停止播放BGM/// </summary>public void StopPlayBGM(){bgmPlayer.Stop();}/// <summary>/// 暂停播放BGM/// </summary>public void PausePlayBGM(){bgmPlayer.Pause();}/// <summary>/// 继续播放BGM/// </summary>public void ResumePlayBGM(){bgmPlayer.Play();}/// <summary>/// 停止播放音效/// </summary>public void StopPlaySound(){soundPlayer.Stop();}#endregion#region Toolsprivate bool bgmFade;//背景音乐是否渐隐private float bgmFadeBeginVolume;//背景音乐渐隐开始时的音量private float bgmFadeBeginTime;//背景音乐渐隐开始的时间private float bgmFadeDuration;//背景音乐渐隐的时间private void Update(){if (bgmFade){float delta = Time.realtimeSinceStartup - bgmFadeBeginTime;if (delta <= bgmFadeDuration){bgmPlayer.volume = Mathf.Lerp(bgmFadeBeginVolume, 0, delta / bgmFadeDuration);}else{bgmFade = false;bgmPlayer.volume = 0;}}}#endregion
}


http://www.ppmy.cn/news/578587.html

相关文章

【7. 无源演奏音乐】

无源演奏音乐 树梅派无源蜂鸣器C调音符与频率对照表 树梅派无源蜂鸣器 /**************************************** 时间&#xff1a;* 内容&#xff1a;无源蜂鸣器演奏&#xff0c;简单版****************************************/#include<wiringPi.h> #include<s…

Unity3d--基于对象池优化思想的音频管理系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Resource文件夹下的音效片段目录二、采用单例模式作为全局访问方式三、音效类型分类四、播放音效的组件池的数据对象五、播放时的参数封装六、音效播放管理…

游戏引擎基础(六)(声音系统,音频APIs)

第6部分: 声音系统&#xff0c;音频APIs声音系统  由于人们玩的游戏在种类和技术上的进步&#xff0c;声音和音乐近几年来在游戏中正逐渐变得重要起来&#xff08;声音是一个实际游戏的可玩特点&#xff0c;比如在Thief和其它同类游戏中的听觉提示&#xff09;。现在四声道环…

空间音频 2

13&#xff5c;如何利用HRTF实现听音辨位&#xff1f; 之前介绍了空间音频的基本概念&#xff0c;以及空间音频是如何采集和播放的。已经基本掌握了空间音频的基本原理。其实在游戏、社交、影视等场景中&#xff0c;空间音频被广泛地应用于构建虚拟的空间环境。 在空间音频的…

house的项目2天总结

uni-house-day01 项目功能点 首页 轮播图 ui-app的轮播组件ui框架的轮播组件【更简单】 图标&#xff08;ui框架布局&#xff09;猜你喜欢 触底加载 【重点】 城市选择页面 【重点】 渲染这个页面&#xff0c;你需要什么数据。把后端的数据转换成自己的数据【前端开发必备的…

Flink基础概念及常识

1.flink入门 官方定义&#xff1a;Apache Flink是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算&#xff0c;Flink能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 简言之&#xff0c;Flink是一个分布式的计…

SpringSecurity3.2.5自定义角色及权限的教程

最近阴差阳错的搞上了SpringSecurity3&#xff0c;因为是自己做的小系统&#xff0c;中间遇到了很多坑&#xff0c;基本每个坑都踩过了&#xff0c;网上也查了不少资料&#xff0c;发现有不少错误的&#xff0c;更是让我绕了一圈又一圈&#xff0c;现在把一些基本的东西总结一下…

SAP用户权限相关操作

SE93 查询所有TCODE 或者 table: tstc SE16 display SUIM 查询用户信息的报表们 技术流 SAP常用的TCODE---BASIS 事务码 描述 ( 中英文 ) SBIT Menu 菜单 SBTA Test background processing 后台处理测试 SBTU Background processing for user 对用户的后台处理 SM36 Define Bac…