Appearance
音频系统
核心一句话
Unity 音频系统主要由四个东西组成:
c
AudioClip:声音数据
AudioSource:播放声音的组件
AudioListener:玩家的耳朵
AudioMixer:混音、分组、音量、效果官方也用现实世界类比:物体发出声音,听者听到声音;Unity 用 AudioSource 和 AudioListener 来模拟这个过程。
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.0001 到 1不要直接把 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 直接传 0,Log10(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 overview、Audio Source、Audio Listener、Audio Clip Import Settings、Audio Mixer、AudioSource.PlayOneShot。