关于 audio
面向使用 Three.js 音频节点的游戏开发者,指导如何设置游戏音效。内容包括事件覆盖、空间音频、混音、重叠播放及浏览器音频启动。
主要功能
- 01在摄像机上设置 AudioListener
- 02选择空间或非空间播放
- 03平衡高频与低频提示音
- 04用节点池处理重叠播放
- 05在用户操作后恢复音频
- 06检查游戏事件的音效覆盖
适用场景
- 01为游戏世界事件添加空间音效
- 02避免重复音效盖过混音
- 03让连续枪声或脚步声播放不中断
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ drawcall-ai/ skills --skill audio安装后在 Claude Code 中输入/audio确认已加载。
详细介绍
音频
声音是反馈,不是点缀。如果某个动作会改变游戏状态(开火、装弹、拾取、受击、死亡、脚步声、UI 点击),却没有声音,这一刻就会显得不对劲。为每个这样的时刻接入声音。
设置
在摄像机上挂载一个 AudioListener,然后为每种声音选择空间音频或非空间音频:
const listener = new AudioListener()
camera.add(listener)
const buffer = await new AudioLoader().loadAsync('/sound-effects/gunshot.mp3')
// World event with a position → PositionalAudio attached to the source (pans + attenuates with distance)
const shot = new PositionalAudio(listener)
shot.setBuffer(buffer)
weapon.add(shot)
shot.play()
// UI / non-spatial event (reload, pickup, menu) → plain Audio
const ui = new Audio(listener)
ui.setBuffer(buffer)
ui.play()
混音平衡
覆盖全面不应让混音听起来疲劳。频繁播放的提示音和循环背景音,其默认音量应低于罕见的确认音,因为重复播放会让声音即使本身合适,也显得很响。脚步声、环境风声、引擎轰鸣、无人机声以及其他近乎持续的声音,通常应作为低音量的背景纹理;它们应能确认动作或氛围,但不要盖过武器声、受击声、UI 确认音或人声。重复播放的声音应从较低音量开始,只有在游戏反馈变得难以辨识时才调高。
对于声源可见或在空间中有意义的世界音效,优先使用空间音频:敌人射击、敌人死亡、撞击、门、机器、游戏世界中的拾取物以及附近的危险。非空间音频适用于 UI、音乐背景、旁白,以及应在听者脑海中保持稳定的玩家专属反馈。如果出于技术原因必须将世界音效设为非空间音频,请降低音量并记录这一权衡,以免听起来像全局警报。
重叠播放与浏览器策略
- 一个
Audio/PositionalAudio节点不能同时播放两次(对正在播放的节点调用.play()会发出警告并且不执行任何操作)。对于快速连续的声音(枪声、脚步声),应保留一小组节点,或每次射击都从共享缓冲区创建一个新节点,以免声音互相截断。PositionalAudio只有在挂载到场景图中时(source.add(node)),才会进行声像定位和音量衰减,因此池化的空间音频节点必须保持挂载状态——普通的非空间Audio没有此要求。 - 浏览器会阻止音频播放,直到用户进行交互。首次点击或按键时恢复音频:
listener.context.resume()。
覆盖范围
检查游戏中的反馈时刻,并确认每个时刻都有声音:开火、空枪、开始装弹 + 装弹完成、拾取、制作、造成伤害和受到伤害、死亡、脚步声(按地面材质变化)、波次/回合转换、胜利/失败。市场上的 sound-effect 和 background-music 资源可以满足大多数需求;如果某个时刻没有合适的资源,请合成一段简短的 WebAudio 音调,不要让它保持静音。
人声与旁白 → speech 技能
对于语音输出——NPC 对话、旁白、教程语音、无障碍朗读——请使用 speech 技能。它会根据文本和语音输入返回音频片段 URL,并提供语音选择、缓存、浏览器自动播放限制以及首次请求预热方面的指导。仅使用此音频技能,通过上述相同的 Audio/PositionalAudio 节点播放生成的片段。