当前位置: 首页 > news >正文

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 方法
参数名类型描述
deviceNamestring麦克风设备名称(传 null 使用默认设备)。
loopbool是否循环录制:true 时超过 lengthSec 后覆盖开头,false 时停止。
lengthSecint录制最大时长(秒)。
frequencyint采样率(常用值:44100Hz 或 48000Hz)。
返回值AudioClip录制的音频数据(需手动赋值给 AudioSource 播放或处理)。
2. End 方法
参数名类型描述
deviceNamestring目标设备名称(传 null 为默认设备)。
3. IsRecording 方法
参数名类型描述
deviceNamestring目标设备名称(传 null 为默认设备)。
返回值booltrue 表示设备正在录制。
4. GetPosition 方法
参数名类型描述
deviceNamestring目标设备名称(传 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}");//}}
}

相关文章:

  • Scratch作品 | 3D原野漫游
  • 数据分析NumPy
  • Modbus转IEC104网关(三格电子)
  • Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
  • docker 学习记录
  • 可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》
  • 【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook
  • 表记录的检索
  • c语言 写一个五子棋
  • vuex基本介绍
  • Linux中安装samba服务
  • 滑动窗口最大值
  • @RequestParam使用场景
  • GUI图形化演示
  • 三轴云台之远程控制与通信技术篇
  • Element Plus 取消el-form-item点击触发组件,改为原生表单控件
  • ​​STC51系列单片机引脚分类与功能速查表(以STC89C52为例)​
  • java每日精进 5.15【分页实现】
  • 自学嵌入式 day 18 - 数据结构 1
  • Seata源码—3.全局事务注解扫描器的初始化一
  • 2025年“新时代网络文明公益广告”征集展示活动在沪启动
  • 中国进出口银行:1-4月投放制造业中长期贷款超1800亿元
  • 明查| 新一代AI诊疗系统可3秒筛查13种癌症?没有证据
  • 十年磨一剑!上海科学家首次揭示宿主识别肠道菌群调控免疫新机制
  • 山西临汾哪吒主题景区回应雕塑被指抄袭:造型由第三方公司设计
  • 筑牢安全防线、提升应急避难能力水平,5项国家标准发布