游戏中的声音元素分为几类:
- 环境音
- 底噪
- 鬼声音
- 物理音效
- 刚体碰撞
- 刚体出入水体
- 玩家脚步声
- 交互音效
声音元素的实现采用 Unity 内集成的 Wwise 音频后端。
对于底噪等恒常的环境音,可以手动配置声音组件(如 Unity 原生的 AudioSource
或 Wwise 提供的组件)。
对于条件性触发或需要程序控制的音效,不应手动配置声音组件,而是交由脚本托管;
脚本会在开始运行后自动生成所需的组件并配置。
如上,可以手配。
但是做成程序化生成的白噪会更好,能做就做。
请参考草稿《声音程序计划》。
游戏中,参与物理交互的刚体在相互碰撞、出入水体、被玩家走过时,都会被动发出声音。
它们的 GameObject
上需要挂载 RigidbodyAgent
组件。
这是项目自己的组件,用来标注刚体的信息,并让它们在初始化时自动注册到游戏的处理列表中。
刚体有自己的材质。 物理音效会根据刚体材质的不同,而拥有不同的音色。 目前有这些材质(缩进代表父子关系):
- Default / 缺省
- Stone / 石质
- Ceramic / 瓷砖
- Wood / 木质
- LightWood / 轻木头
- HeavyWood / 重木头
- Plastic / 塑料
- Rubber / 橡胶
- Metal / 金属
- Steel / 钢
- Stone / 石质
两个刚体以一定速度碰撞时,会发出碰撞音效。 碰撞音效不仅与刚体的材质有关,也与接触面积和碰撞强度有关。
在碰撞发生时,参与碰撞的刚体会分别各自发出自己的碰撞音效。
每个刚体都会收到一个 OnRigidbodyCollided
的 Wwise 事件。
其有三个参数:
string
刚体材质。float
接触面积。float
碰撞动量(自身质量×碰撞相对法向速度)。
这个好调,不够可以再改。
Wwise 端在收到事件后,应该根据刚体材质,找到正确的碰撞音效类型,将其余参数传进去并触发。
刚体在出入水体时会有对应的音效。 与其余物理音效不同的是,这个音效并没有材质上的区别。 不管是什么刚体,在出入水体时都会发出相似的声音。
在 Wwise 端可以实现为随机选择。
玩家在刚体表面上行走时会每隔一定时间间隔触发一次脚步声。
游戏会临时在世界里生成一个空 GameObject
,并赋予其发声的能力;
在声音播放完毕后即销毁。
这个负责播放声音的 GameObject
会在创建后立即触发 OnFootstep
的 Wwise 事件。
其有两个参数:
string
行走表面的材质。bool
是否在奔跑。
同样可以调。 懒得区分走路跑步就甭区分了。
交互音效是玩家做出某种交互操作时,发出的不在世界里的提示音效。 目前有两种:
- 抓取物体 /
OnGrabbingObject
- 放下物体 /
OnDroppingObject
以后可能再加。
交互发生时,游戏会在主相机的 Wwise 组件上触发对应的事件。