Skip to content

音频系统

unity-audio-system-deep-dive

核心一句话

Unity 音频系统主要由四个东西组成:

c
AudioClip:声音数据
AudioSource:播放声音的组件
AudioListener:玩家的耳朵
AudioMixer:混音、分组、音量、效果

官方也用现实世界类比:物体发出声音,听者听到声音;Unity 用 AudioSourceAudioListener 来模拟这个过程。

1. AudioClip:声音资源

你把音频文件拖进 Assets 后,它就会成为 AudioClip

常见格式:

c
WAV
MP3
OGG
AIFF

常见用途:

c
click.wav       按钮音
jump.wav        跳跃音
hit.wav         攻击命中
bgm.mp3         背景音乐
rain_loop.ogg   环境声

导入设置里重点看:

c
Load Type:加载方式
Compression Format:压缩格式
Quality:质量
Preload Audio Data:是否预加载
Load In Background:是否后台加载

简单记:

c
短音效:Decompress On Load 或 ADPCM
长音乐:Streaming
大量脚步/攻击音:ADPCM 常见
背景音乐:Vorbis/MP3/Streaming 常见

2. AudioSource:发声器

AudioSource 挂在 GameObject 上,负责播放声音。

常见属性:

c
AudioClip:要播放的声音
Volume:音量
Pitch:音高/播放速度
Loop:是否循环
Play On Awake:游戏开始时自动播放
Spatial Blend:2D / 3D 声音比例
Output:输出到哪个 AudioMixer Group

最简单播放:

c
using UnityEngine;

public class SimpleAudio : MonoBehaviour
{
    public AudioSource audioSource;

    public void PlaySound()
    {
        audioSource.Play();
    }
}

播放一次性音效更常用:

c
using UnityEngine;

public class SfxPlayer : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip jumpClip;

    public void PlayJump()
    {
        audioSource.PlayOneShot(jumpClip);
    }
}

Play() 适合播放 AudioSource 当前绑定的 clip。 PlayOneShot() 适合按钮音、脚步声、攻击音这种一次性音效。

3. AudioListener:听者

AudioListener 通常在 Main Camera 上。

你可以把它理解成:

c
玩家的耳朵

注意:

c
一个场景通常只应该有一个 AudioListener

如果有多个摄像机,每个摄像机都带 Listener,就容易报错或声音异常。

4. 2D 声音和 3D 声音

AudioSource 的:

c
Spatial Blend
0 = 2D 声音
1 = 3D 声音

2D 声音适合:

c
BGM
UI 点击音
系统提示音
胜利/失败音效

3D 声音适合:

c
敌人叫声
爆炸
脚步声
门开关
远处机器声
瀑布/火焰/车辆

3D 声音会受距离、方向、衰减曲线影响。玩家离声源越远,声音通常越小。

5. AudioMixer:音频分组和总控

正式项目最好用 AudioMixer,不要每个 AudioSource 单独调。

常见结构:

c
Master
├─ Music
├─ SFX
├─ UI
└─ Voice

好处:

c
统一调 BGM 音量
统一调音效音量
做暂停时低通滤波
做水下/洞穴/受伤耳鸣效果
用 Snapshot 切换音效氛围

音量滑条案例:

c
using UnityEngine;
using UnityEngine.Audio;

public class VolumeSettings : MonoBehaviour
{
    public AudioMixer mixer;

    public void SetMusicVolume(float value)
    {
        float db = Mathf.Log10(Mathf.Max(value, 0.0001f)) * 20f;
        mixer.SetFloat("MusicVolume", db);
    }
}

UI Slider 推荐范围:

c
0.00011

不要直接把 0~1 塞给 Mixer 音量,因为 Mixer 用的是 dB,不是普通百分比。

6. 背景音乐管理器

c
using UnityEngine;

public class MusicManager : MonoBehaviour
{
    public static MusicManager Instance;

    public AudioSource musicSource;

    private void Awake()
    {
        if (Instance != null)
        {
            Destroy(gameObject);
            return;
        }

        Instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void PlayMusic(AudioClip clip)
    {
        if (musicSource.clip == clip) return;

        musicSource.clip = clip;
        musicSource.loop = true;
        musicSource.Play();
    }
}

这个适合跨场景播放 BGM。

7. 常见坑

c
场景里有多个 AudioListener
AudioSource 没有绑定 AudioClip
Play On Awake 开着,声音一进场景就播放
3D 声音太小,是因为离 Listener 太远或 Min/Max Distance 不合适
BGM 忘记勾 Loop,播完就停
音量 Slider 直接传 0Log10(0) 出问题
短音效用一个 AudioSource 连续 Play,后一个会打断前一个
所有声音都不分组,后期做音量设置很痛苦

学习路线

c
1. 会导入 AudioClip
2. 会给物体加 AudioSource
3. 会播放 BGM 和按钮音效
4. 会区分 2D / 3D 声音
5. 会使用 PlayOneShot
6. 会用 AudioMixer 分 Music / SFX / UI
7. 会做音量滑条
8. 再学 Snapshot、Reverb、Audio Filter、对象池音效

记住口诀

c
Clip 是声音文件。
Source 负责播放。
Listener 是玩家耳朵。
Mixer 管分组和总音量。
2D 给 UI/BGM,3D 给场景物体。

参考:Unity 官方 Audio overviewAudio SourceAudio ListenerAudio Clip Import SettingsAudio MixerAudioSource.PlayOneShot

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0