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}");
        //}
    }
}
相关推荐
明耀7 分钟前
WPF C# 用WebView加载H5页面(uniapp项目,vue项目)
uni-app·c#·wpf
m0_738206541 小时前
嵌入式学习的第二十二天-数据结构-栈+队列
数据结构·学习
我不是程序猿儿4 小时前
【C#】 lock 关键字
java·开发语言·c#
向上的车轮7 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
Magnum Lehar7 小时前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
前端小崔8 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
动感光博8 小时前
Unity序列化字段、单例模式(Singleton Pattern)
unity·单例模式·c#
龙湾开发8 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图
liang_20269 小时前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结
虾球xz9 小时前
游戏引擎学习第290天:完成分离渲染
c++·人工智能·学习·游戏引擎