音频系统

14.1 Audio Source 组件

AudioSource 是音频播放的核心组件。

核心属性

属性 说明
AudioClip 音频文件(WAV / MP3 / OGG / AAC)
Output 输出到的 Audio Mixer Group
Mute 静音
Play On Awake 启动时自动播放
Loop 循环播放
Volume 音量(0~1)
Pitch 音调(-3~3,1 为原速)
Stereo Pan 立体声声像(-1 左, 0 中, 1 右)
Spatial Blend 2D vs 3D 混合(0=2D, 1=3D)

14.2 播放音频

基础播放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class AudioManager : MonoBehaviour
{
[SerializeField] private AudioSource bgmSource;
[SerializeField] private AudioSource sfxSource;
[SerializeField] private AudioClip jumpClip;
[SerializeField] private AudioClip hitClip;

void Start()
{
// 播放背景音乐
bgmSource.loop = true;
bgmSource.Play();
}

void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 播放音效(一次)
sfxSource.PlayOneShot(jumpClip);
}

if (Input.GetKeyDown(KeyCode.H))
{
// PlayOneShot 可以叠加播放(多次音效重叠)
sfxSource.PlayOneShot(hitClip, volumeScale: 0.8f);
}
}
}

音频播放 API

1
2
3
4
5
6
7
8
9
10
11
12
13
// 基本播放
audioSource.Play(); // 从头播放
audioSource.PlayDelayed(1f); // 延迟播放
audioSource.PlayOneShot(clip); // 播放一次(可叠加)
audioSource.PlayScheduled(dspTime); // 指定 DSP 时间播放

// 暂停/停止
audioSource.Pause();
audioSource.UnPause();
audioSource.Stop();

// 状态检测
bool isPlaying = audioSource.isPlaying;

14.3 2D vs 3D 音频

Spatial Blend 控制

1
2
audioSource.spatialBlend = 0f;    // 2D(全屏音,适合 BGM)
audioSource.spatialBlend = 1f; // 3D(空间音,随距离变化)

3D 音频设置

属性 说明
Doppler Level 多普勒效应(0 关闭)
Spread 扩散角度(度)
Min Distance 最小距离(音量衰减起点)
Max Distance 最大距离(音量衰减终点)

14.4 Audio Mixer

Audio Mixer 提供专业的混音和效果处理。

创建 Mixer

Project 面板 → Create → Audio Mixer

常用功能

  • Group 分组:BGM、SFX、Voice 等分组管理
  • Volume 控制:通过暴露参数(Exposed Parameters)用脚本控制
  • 效果器:回声(Echo)、混响(Reverb)、低通滤波(Lowpass)等
  • 快照(Snapshots):保存不同效果配置,可动态切换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine.Audio;

public class MixerController : MonoBehaviour
{
[SerializeField] private AudioMixer audioMixer;

public void SetMasterVolume(float volume)
{
// 暴露参数后在 Mixer 中命名(如 "MasterVolume")
audioMixer.SetFloat("MasterVolume", Mathf.Log10(volume) * 20);
}

public void SetBGMVolume(float volume)
{
audioMixer.SetFloat("BGMVolume", Mathf.Log10(volume) * 20);
}

public void SwitchSnapshot(AudioMixerSnapshot snapshot)
{
snapshot.TransitionTo(0.5f); // 0.5 秒过渡
}
}

AudioMixer 的音量单位是分贝(dB),所以需要将 0~1 的线性值转换为 dB:dB = Mathf.Log10(volume) * 20


14.5 音频管理最佳实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class GameAudioManager : MonoBehaviour
{
public static GameAudioManager Instance { get; private set; }

[SerializeField] private AudioSource bgmSource;
[SerializeField] private AudioSource sfxSource;

void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}

public void PlayBGM(AudioClip clip)
{
bgmSource.clip = clip;
bgmSource.Play();
}

public void PlaySFX(AudioClip clip, float volume = 1f)
{
sfxSource.PlayOneShot(clip, volume);
}

public void PlaySFXAtPoint(AudioClip clip, Vector3 position, float volume = 1f)
{
AudioSource.PlayClipAtPoint(clip, position, volume);
}
}

14.6 本章小结

  • AudioSource 播放音频,支持 2D/3D 模式
  • PlayOneShot 适合一次性的叠加音效
  • Spatial Blend 控制 2D 与 3D 的混合比例
  • Audio Mixer 实现专业混音和效果控制
  • 单例模式管理全局音频

练习题

  1. 为角色的跳跃和落地添加音效
  2. 使用 Audio Mixer 分别控制 BGM 和 SFX 音量
  3. 实现一个 3D 音效:物体离玩家越近声音越大
  4. 使用 Mixer Snapshot 实现”进入菜单时 BGM 变低沉”的效果
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Unity3D开发基础教程 系列
第 14/20 篇
分享: