Unity基础学习(十五)核心系统——音效系统
目录
一、关于音频文件的导入相关
二、音频源组件Audio Source
三、Audio Listener的介绍
四、关于播放音乐的方式
五、麦克风输入相关
Microphone 类方法与属性总览
1. Start 方法
2. End 方法
3. IsRecording 方法
4. GetPosition 方法
5. devices 属性
一、关于音频文件的导入相关
音频文件的几种常见格式: wav mp3 ogg aiff
随意将一个音频文件拖入到Unity中,可发现如下面板:
Force To Mono多声道转单声道
Normalize 强制为单声道时,混合过程中被标准化
Load In Background 在后台加载,不阻塞主线程
Ambisonic
立体混响声
非常适合 360 度视频和 XR 应用程序
如果音频文件包含立体混响声编码的音频,请启用此选项
大部分情况下这些参数,是不用手动调整的,默认的就很OK,除非你想做什么比较特殊的效果。
接着我们来看看这里的参数:
LoadType
加载类型
Decompress On Load
不压缩形式存在内存,加载块,但是内存占用高
适用于小音效
Compress in memory
压缩形式存在内存,加载慢,内存小
仅适用于较大音效文件
Streaming
以流形式存在,使用时解码。内存占用最小,cpu消耗高。建议设置为该模式,避免出现奇奇怪怪的问题
性能换内存
Preload Audio Data
预加载音频,勾选后进入场景就加载,不勾选,第一次使用时才加载。
Compression Format
压缩方式
PCM
音频以最高质量存储
Vorbis
相对PCM压缩的更小,根据质量决定
ADPCM
包含噪音,会被多次播放的声音,
PCM 和 ADPCM 压缩格式允许自动优化或手动降低采样率,采样率越高,损失就越小,声音音质就会更还原。如碰撞声
Quality
音频质量
确定要应用于压缩剪辑的压缩量。
不适用于 PCM/ADPCM/HEVAG 格式
Sample Rate Setting
Preserve Sample Rate
此设置可保持采样率不变(默认值)
Optimize Sample Rate
此设置根据分析的最高频率内容自动优化采样率
Override Sample Rate
此设置允许手动覆盖采样率
因此可有效地将其用于丢弃频率内容。
二、音频源组件Audio Source
Unity引擎中的Audio Source(音频源)组件是用于在游戏场景中播放音频的核心组件。它通过加载音频剪辑(AudioClip)并控制播放参数,实现声音的播放、空间化、混合及特效处理。注意:这个组件只是管理,各种音乐怎么播放,可以有很多个,你可以理解为这是音源,实际接收用其他的组件进行。
AudioClip:绑定需要播放的音频文件(如背景音乐、音效)。
Output:指定音频输出到某个音频混音器(Audio Mixer),用于全局音频控制(如音量分层、特效叠加)。
Mute:静音,勾选后音频静音但仍在后台播放。
Play On Awake:勾选后,场景启动时自动播放音频。
Loop:勾选后音频循环播放(如背景音乐)。
Bypass Effects:勾选后绕过所有音频特效处理(如混响、滤波),输出原始音频。
Bypass Listener Effects:仅绕过监听器(Audio Listener)的特效处理。
Bypass Reverb Zones:忽略场景中的混响区域效果。
Priority (0-256):音频播放优先级。数值越低优先级越高,系统在资源不足时会优先保留高优先级音频
Volume:音量大小(0-1,图中为最大音量1)。
Pitch:音调高低(1为原速,>1加速升调,<1减速降调)。
Stereo Pan:立体声左右声道平衡(-1左偏,0居中,1右偏)。
Spatial Blend:混合2D与3D音效(0为纯2D全局音效,1为纯3D空间音效,受物体位置影响)。
Reverb Zone Mix:控制混响区域对音频的影响强度(0-1,图中为1,即完全应用混响效果)。
3D Sound Settings(可展开):进一步调整3D音频衰减曲线、多普勒效应等
Doppler Level(多普勒等级,值为1)
功能:模拟现实中多普勒效应——当声源(如汽车、角色)快速靠近或远离听者时,声音频率会因相对速度发生变化(靠近时音调变高,远离时变低)。
取值逻辑:值为 0 时禁用多普勒效果;1 为现实标准值(图中默认),数值越大效果越夸张(如科幻场景)。
Spread(扩散,值为150)
功能:控制 立体声扩散角度(单位:度)。
效果:数值越大,声源在3D空间中的立体声分布越广(如环境音效扩散到周围);数值为 0 时声音完全集中在声源朝向。
Volume Rolloff(音量衰减类型,Logarithmic Roll)
功能:定义声音随距离听者的衰减方式。
类别对比:
Logarithmic(对数衰减):声音快速衰减至最小距离外(适合短距离音效,如枪声)。
Linear(线性衰减):均匀衰减(适合中距离音效)。
Custom(自定义):手动绘制衰减曲线。
Min/Max Distance(最小/最大距离,1/500)
最小距离(1):在此范围内音量最大且不衰减(如角色脚步声应设为接近身体的范围)。
最大距离(500):超过此距离后声音完全消失(需根据场景尺寸动态调整,避免过多音频计算)。
关于自定义的曲线:
图表解析(Listener 相关)
横轴(距离):声源与听者的距离(0~500)。
关键曲线:
红色(Volume):显示音量随距离减弱的曲线(对数衰减表现为初期锐减,后期平缓)。
绿色(Spatial Blend):混合2D与3D音效的比例(例如远处声音用更多3D效果)。
蓝色(Spread):扩散范围随距离的变化。
黄色(Reverb Zone Mix):随距离调整混响强度(如山洞中的回声)。
三、Audio Listener的介绍
Audio Listener
是 Unity 中用于接收场景中所有 Audio Source 音频信号的组件,相当于玩家的“耳朵”。
核心职责:
位置与方向感知:根据监听器的位置和旋转方向,计算 3D 音频的空间效果(如左右声道差异、距离衰减)。
音频混合输出:将场景中所有有效范围内的 Audio Source 混合后输出到扬声器或耳机。
特点:
唯一性规则
每个场景只能有一个活跃的 Audio Listener!
默认情况下,新场景中的主摄像机会自动挂载 Audio Listener。
冲突处理:如果多个对象挂载了 Audio Listener,Unity 会报错并仅保留第一个激活的组件。
小结:
在 Unity 音频系统中,Audio Source(音频源)和 Audio Listener(音频监听器)是分工协作的两个核心组件:
1. Audio Source 的作用
控制音频如何播放:负责声音的“发射”逻辑,包括:
音频文件加载(AudioClip)、播放/暂停/循环控制。
空间化参数设置:通过 3D Sound Settings(如衰减曲线、多普勒效应、扩散角度)定义声音在 3D 空间中的传播规则。
音效处理:音量(Volume)、音调(Pitch)、声道平衡(Stereo Pan)等基础属性,以及混响、滤波等特效的叠加。
不涉及“听到什么”:它仅定义声音的源头和传播方式,但无法决定这些声音是否被玩家接收。
2. Audio Listener 的作用
负责音频的“监听”:相当于玩家的“耳朵”,决定哪些声音会被实际听到。核心功能包括:
位置与方向感知:监听器的位置(通常绑定到主摄像机)决定了玩家听到的声音空间关系(如左右声道差异、距离衰减)。
环境效果整合:接收场景中所有 Audio Source 的输入,并根据监听器的位置和方向,混合成最终输出到扬声器的音频信号。
唯一性限制:每个场景只能有一个活跃的 Audio Listener(通常挂载在玩家角色的摄像机上)。
协同工作流程
Audio Source 发射声音:根据其 3D 参数(如 Min/Max Distance、衰减曲线)计算声音的传播范围与强度。
Audio Listener 接收声音:根据监听器的位置和方向,筛选出有效范围内的 Audio Source,并计算其相对位置、速度、方向对声音的影响(如多普勒效应、立体声平衡)。
最终混合输出:将多个 Audio Source 的声音按优先级和空间关系混合后输出到音频设备。
四、关于播放音乐的方式
直接调用Audio Source组件中的属性或者API。
AudioSource ao;然后获取该组件即可。
方法名 | 作用 | 代码示例 |
---|---|---|
Play() | 播放音频(从头开始) | ao.Play(); |
PlayDelayed(float) | 延迟指定秒数后播放 | ao.PlayDelayed(2.5f); |
Stop() | 立即停止播放并重置进度 | ao.Stop(); |
Pause() | 暂停播放(保留进度) | ao.Pause(); |
UnPause() | 从暂停处继续播放 | ao.UnPause(); |
PlayOneShot(AudioClip) | 播放一次音频(不打断当前播放,适合短音效) | ao.PlayOneShot(clip); |
补充一个是否正在播放的属性:ao.isPlaying
例如动态循环播放某一组音乐:
// 使用单一 AudioSource 播放多个音效
public AudioClip[] clips;
private int currentClipIndex = 0;void PlayNextClip() {ao.Stop();ao.clip = clips[currentClipIndex];ao.Play();//这里的模运算 是为了防止越界//例如:设clips.Length为10//则 随着当前currenrClipIndex的增加,保障了数组不会越界,会逐个播放currentClipIndex = (currentClipIndex + 1) % clips.Length;
}
五、麦克风输入相关
所谓的麦克风就是,我们利用一些设备,能够在Unity通过麦克风转成我们想要的音频文件。
Microphone 类方法与属性总览
名称 | 类型 | 参数/返回值 | 描述 |
---|---|---|---|
Start | 静态方法 | (string deviceName, bool loop, int lengthSec, int frequency) → AudioClip | 开始录制音频,返回关联的 AudioClip 。若设备未准备好,可能返回 null 。 |
End | 静态方法 | (string deviceName) → void | 停止指定设备的录制(传 null 表示默认设备)。 |
IsRecording | 静态方法 | (string deviceName) → bool | 检查指定设备是否正在录制。 |
GetPosition | 静态方法 | (string deviceName) → int | 获取当前录制位置的样本索引(用于计算录制时长:position / frequency )。 |
devices | 静态属性 | string[] | 只读属性,返回所有可用的麦克风设备名称列表(若权限未授权可能返回空数组)。 |
1. Start
方法
参数名 | 类型 | 描述 |
---|---|---|
deviceName | string | 麦克风设备名称(传 null 使用默认设备)。 |
loop | bool | 是否循环录制:true 时超过 lengthSec 后覆盖开头,false 时停止。 |
lengthSec | int | 录制最大时长(秒)。 |
frequency | int | 采样率(常用值:44100Hz 或 48000Hz)。 |
返回值 | AudioClip | 录制的音频数据(需手动赋值给 AudioSource 播放或处理)。 |
2. End
方法
参数名 | 类型 | 描述 |
---|---|---|
deviceName | string | 目标设备名称(传 null 为默认设备)。 |
3. IsRecording
方法
参数名 | 类型 | 描述 |
---|---|---|
deviceName | string | 目标设备名称(传 null 为默认设备)。 |
返回值 | bool | true 表示设备正在录制。 |
4. GetPosition
方法
参数名 | 类型 | 描述 |
---|---|---|
deviceName | string | 目标设备名称(传 null 为默认设备)。 |
返回值 | int | 当前录制位置的样本索引。 |
5. devices
属性
类型 | 描述 |
---|---|
string[] | 返回当前设备连接的麦克风名称列表(需确保已获取麦克风权限)。 |
综合示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestMicrophone : MonoBehaviour
{private AudioSource adsource;private AudioClip recordedClip;public bool isRecording = false;// Start is called before the first frame updatevoid Start(){adsource = this.GetComponent<AudioSource>();if (adsource == null) {adsource = this.gameObject.AddComponent<AudioSource>();}print("所有可用麦克风");foreach(string name in Microphone.devices) {print(name);}}// Update is called once per framevoid Update(){//if (Input.GetKeyDown(KeyCode.Space) && !isRecording) {// if (Microphone.devices.Length == 0) {// Debug.LogError("未检测到麦克风");// return;// }// recordedClip = Microphone.Start(null,false,10,44100);// isRecording = true;// Debug.Log("开始录制...");//}//if (Input.GetKeyUp(KeyCode.Space) && isRecording) {// //停止录制// Microphone.End(null);// isRecording = false;// //播放刚存的切片// adsource.clip = recordedClip;// adsource.Play();// Debug.Log("播放录制内容");// // 获取音频数据(示例)// float[] samples = new float[recordedClip.samples * recordedClip.channels];// recordedClip.GetData(samples, 0);// Debug.Log($"音频数据长度: {samples.Length}");//}}
}