一.引言
音效也是游戏比较重要的一部分,下面会介绍音频导入到Unity项目中的一些参数设置以及介绍,并通过代码来进行操作
二.音频常规设置
先总体预览一下,比如Unity能够识别的音频后缀格式,图中的很多参数我们都用不到,它们基本上和音效设计有关,我们需要了解的就是如何Load,如何异步线程Load,如何设置压缩率,如何选择目标平台,这些就足够了,下面通过一张动图来简单展现音频的参数面板
三.音乐的播放
上面只是将音频导入到项目中来,还未加载到游戏场景中去进行播放,音乐播放必备两个组件,一是音频源Aduio Source,而是音频监听Audio Listener,两种的关系是一对多,Audio Listener全场只有一个,但Audio Source可以有多个,默认创建一个Camera就会附带一个Audio Listener,所以需要移除多余的Audio Listener,否则会报警告
![]()
和音频源有关的面板参数配置如上图所示,一个空物体添加音频源后,它会呈现一个耳朵的图案,这里唯一想提的就是2D和3D的音效控制,也就是图中的Spatial Blend选项,默认是0(2D),1是3D,顾名思义,3D音效会受物体的距离影响音量,想听脚步声,就得使用3D,近大远小的效果,而一般的平面游戏,比如王者荣耀的游戏音效声就是2D,与距离无关
四.通过代码操控音频
- 代码控制播放停止
if( Input.GetKeyDown(KeyCode.P) ) { //播放音效 audioSource.Play(); //延迟播放 填写的是秒数 //audioSource.PlayDelayed(5); } if (Input.GetKeyDown(KeyCode.S)) { //停止音效 audioSource.Stop(); } if( Input.GetKeyDown(KeyCode.Space) ) { //暂停 audioSource.Pause(); } if( Input.GetKeyDown(KeyCode.X) ) { //停止暂停 和暂停后 Play效果是一样的 都会继续播放现在的音效 audioSource.UnPause(); } - 检测音效播放完毕
void Update() { //如果你希望某一个音效播放完毕后 想要做什么事情 //那就可以在Update生命周期函数中 不停的去检测 它的 该属性 //如果是false就代表播放完毕了 if(audioSource.isPlaying) { print("播放中"); } else { print("播放结束"); } } - 动态控制音效播放
动态控制音效播放有如下三种方式,动态添加脚本的方式是最常用的- 直接在要播放音效的对象上挂载脚本 控制播放,默认勾选了Play On Awake
- 实例化挂载了音效源脚本的对象
//外部拖入挂载了Audio Source并制定了AudioClip(音频文件)的预制体 public GameObject obj; public GameObject obj; //并且在实例化之后就直接播放音频 - 用一个AudioSource来控制播放不同的音效
// 外部拖入一个音频文件 public AudioClip clip; // 使用时只需挂载一个脚本,设置播放即可 AudioSource aus = this.gameObject.AddComponent<AudioSource>(); aus.clip = clip; aus.Play();
五.麦克风输入
喊麦在游戏中也非常常见,下面通过代码的方式梳理Unity中启用麦克风,以及获取录入的语音数据
- 获取设备麦克风信息
Unity提供了相关API获取所有的麦克风设备,使用默认的也可以string[] strs = Microphone.devices; for (int i = 0; i < strs.Length; i++) { print(strs[i]); } - 开始录制声音
传入设备名可以通过1中的方式获取你想要的设备并传入//参数一:设备名 传空使用默认设备 //参数二:超过录制长度后 是否重头录制 //参数三:录制时长 //参数四:采样率 if( Input.GetKeyDown(KeyCode.Space) ) { clip = Microphone.Start(null, false, 10, 44100); } - 结束录制
玩家录入的声音可以通过if( Input.GetKeyUp(KeyCode.Space) ) { Microphone.End(null); //第一次去获取 没有才添加 AudioSource s = this.GetComponent<AudioSource>(); if (s == null) s = this.gameObject.AddComponent<AudioSource>(); s.clip = clip; s.Play(); // 获取录入的声音数据 //规则 用于存储数组数据的长度 是用 声道数 * 剪辑长度 float[] f = new float[clip.channels * clip.samples]; clip.GetData(f, 0); print(f.Length); #endregion }AudioClip进行保存,然后通过上述的方式存到一个数组中,后续还可以将其转换成二进制流传输到网络中去