声音系统总览

声音系统的接口主要面向两类需求,一类是长度较长,循环持续播放的 “音乐”,一类是长度较短,一次性播放的 “音效”。
所有音频资源都会在编辑器内导入成 AudioClip 资源,要播放声音,首先需要在场景里创建 AudioSource。

对于音乐,可以直接将 AudioClip 赋给 AudioSource 上的 clip 属性,勾选 playOnAwake 属性或脚本调用组件的 play 方法来控制播放;
对于音效,可以在脚本里调用 AudioSource 的 playOneShot 方法,在调用时传入要播放的音效片段和音量。

注意虽然 AudioClip 资源本身也直接有 play 等接口实现,但 AudioSource 才是常规的播放入口,请尽量使用组件完成工作流。

音频相关事件

所有的 AudioClip 资源对象都是一个 EventTarget:

  • 在音频开始实际播放时,会发出 started 事件;
  • 在音频播放自然结束时,会发出 ended 事件;

平台差异性

目前支持 Web Audio API、DOM 音频、微信小游戏音频三种接口,虽然运行时各个平台的音频接口实现并不完全统一,
我们已经尽力在引擎中最小化这部分差异,但还是会存在一部分不可协调的不一致性:

  • iOS 平台 DOM 音频模式不支持调整音量大小,所有 volume 相关属性将不会有效;
  • 只有 Web Audio 模式支持同一音频的多重播放,其他模式下为避免重复创建,多次调用 playOneShot 的默认行为是从头开始重新播放;
  • 目前大部分平台都已遵守最新的 auto play police,即使设置了 playOnAwake 也会在第一次接收到用户输入时才开始播放;