Unity基础学习(十五)核心系统——音效系统

目录

一、关于音频文件的导入相关

[二、音频源组件Audio Source](#二、音频源组件Audio Source)

[三、Audio Listener的介绍](#三、Audio Listener的介绍)

四、关于播放音乐的方式

五、麦克风输入相关

[Microphone 类方法与属性总览](#Microphone 类方法与属性总览)

[1. Start 方法](#1. Start 方法)

[2. End 方法](#2. End 方法)

[3. IsRecording 方法](#3. IsRecording 方法)

[4. GetPosition 方法](#4. GetPosition 方法)

[5. devices 属性](#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

例如动态循环播放某一组音乐:

cs 复制代码
// 使用单一 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[] 返回当前设备连接的麦克风名称列表(需确保已获取麦克风权限)。

综合示例:

cs 复制代码
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 update
    void 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 frame
    void 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}");
        //}
    }
}
相关推荐
starsky7623827 分钟前
Agent学习——上下文工程(三)
学习
samble1 小时前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
xier_ran2 小时前
【infra之路】AI 编译器学习笔记(四):PatternRewriter 与贪心 driver
人工智能·笔记·学习
jun_bai2 小时前
使用Aspose实现word文档合并,内容替换
windows·c#·word
小弥儿2 小时前
GitHub今日热榜 | 2026-10-12:pytorch 上升四位
人工智能·pytorch·学习·开源·github
AOI小白新手上路3 小时前
DeepLens 的课程学习自动设计与同源仿真论文综述
学习
xcLeigh3 小时前
Unity基础:Instantiate实例化——在运行时动态创建游戏物体
游戏·unity·游戏引擎·教程·instantiate
老王爱玩车3 小时前
预处理详解
c语言·开发语言·学习
Awh-4 小时前
ARM 裸机开发 DAY9 学习笔记
arm开发·笔记·学习
CAIE研习社4 小时前
CAIE认证与在线AI课程证书对比:完成条件、考试评价、学习支持怎么区分
学习