大家好,我是谭宇,来自一罐盐声音工作室(Salt Sound Studio)。下面将通过这篇博客跟大家分享一下我们的项目 —《Clocker》的声音设计历程。在这个项目中我负责了游戏中Wwise音频引擎的接入与搭建、游戏的音效制作与交互机制的设计。
《Clocker》是一款以时间为题材,以父女亲情为感情基调的冒险解谜类独立游戏,由Wild kid Games历时四年研发。游戏拥有其独有的时间解谜机制,唯美的手绘画风,充满趣味的谜题以及扣人心弦的剧情。讲述了一段父亲与女儿间的故事,采用了双主角的叙事手法,通过分别控制父亲与女儿,从而慢慢解开故事中的谜题,推进故事的发展。
游戏的玩法是围绕一块钟表来控制NPC的行动与逻辑线。在游戏中父亲是在一个时间静止的空间中使用钟表控制时间的流逝与回溯,女儿出现后会恢复被父亲静止的时间并继续下去让时间恢复正常的流逝。
在没测试游戏之前,我们把这个游戏定义为了一个小体量的游戏,认为游戏中可能不会需要太多的声音。直到测试以后我们拿到了游戏中所有的物料才发现这个游戏没有我们想的那么简单。
在上图中我们可以先看一下游戏中的逻辑关系图,每条逻辑线代表了游戏中NPC的一套动作,图中只是2个NPC的逻辑线路图。
可以看到玩家进入到场景后操纵小偷会触发小偷的A逻辑向前移动去开门(小偷A逻辑分为两段,一段是移动一段是开门。如果A逻辑播放到一半或者没打开门是不会触发别的逻辑事件,很多NPC会出现一条逻辑多个阶段的情况)。
小偷A逻辑全部播放完毕后会通过这个动作触发屋主的B逻辑,屋主会跑向小偷。这时玩家操纵屋主会出现两个情况,一个是屋主冲过去打了小偷,另一个是操纵屋主到一半的情况下,使屋主的时间回退到逻辑A,然后转身去控制小偷。这时会根据屋主当前逻辑播放的阶段判断小偷到底是选择E逻辑还是D逻辑,以此类推我们可以发现这个游戏的逻辑很复杂。在下图中我们可以看到游戏中关于人物状态切换的情况,图中钟表会出现两条时间线来表现人物状态的改变。
通过上述描述已经清楚了游戏的玩法与逻辑,我们统计了一下游戏内的NPC一共有70个,像上图中的逻辑线路一共有682条。而且游戏充分运用了蝴蝶效应来控制剧情的走向。
蝴蝶效应意味着游戏中需要实时记录所有操纵过NPC的声音播放位置,就是说我们操纵了一个NPC的时间走到一半之后需要记录这个音频的播放时间信息来保证下次继续操纵这个NPC的时候声音与画面可以同步,还需要满足声音正反向的操纵。
在满足上述条件的前提下我们把游戏的声音设计分为了五部分:
-
父亲时间
- 如何展现时间的流逝与回溯
- 如何精确记录声音播放时间的位置
-
女儿时间
- 如何表现时间的渐变
- 静止动画的延展
- 配音的问题
-
对应游戏的功能
- 如何通过手柄按压力度控制声音的播放速度
-
互动音乐
- 如何利用音乐控制玩家的行为
- Clocker互动音乐设计
-
性能优化
- Soundbank的管理
- 针对不同平台的音频压缩
列举出制作思路以后我们又发现了一个问题,发现在音频功能上的需求还是蛮多的,介于现在的开发周期来说Unity自带的音频引擎没有办法快速解决我们当前需要的功能。所以我们使用了Wwise音频引擎来帮助我们实现更多的音频功能。
在游戏中的具体实现
父亲时间
如何展示时间的流逝和回溯
我们尝试了很多种手段去配合游戏内的机制,但是单独的音效很难把每个人物的时间状态呈现出来。如果只做单独的音效去配合游戏中的动画,很难精确的对应当前逻辑线上的时间点。最后决定对应每个人物的逻辑线去制作一整条的逻辑线音效,这样既能很好的维护每个人物的音效也能解决游戏内玩家操纵时间正反向过程需要记录当前声音播放位置的问题。
上面两张图中列举了我们对应人物逻辑线制作的Event与切换逻辑时用到的Switch组。按照场景名、当前场景的NPC、NPC下的逻辑来精确的寻找需要的事件,这样在维护方面节省了很多的时间。
我们尝试了很多种手段去配合游戏内的机制,但是单独的音效很难把每个人物的时间状态呈现出来。如果只做单独的音效去配合游戏中的动画,很难精确的对应当前逻辑线上的时间点。最后决定对应每个人物的逻辑线去制作一整条的逻辑线音效,这样既能很好的维护每个人物的音效也能解决游戏内玩家操纵时间正反向过程需要记录当前声音播放位置的问题。
关于时间反向的过程,为单个动作或者物品制作的音效都很难达到反向的整体性,反向效果也不是很突出,很难表现声音的回退过程。为了达到更好的效果,我们在尝试了很多种方法后,最终决定把正向整条的声音做Reverse,然后在当前音频中加一层低频来与游戏中的时间机制相配合。通过在游戏中同时播放正反向两条音频,实时切换Switch选择逻辑以达到匹配从A逻辑切换到B逻辑的播放状态。不过工作量也是翻了N倍,为了好效果我们也是拼了。下图中可以看到整条音频的波形。
接下来在GameParameters中定义了1与-1的值用来判断对应的时间线,1是正向播放-1是反向播放。前进时调用正向的音效,后退时调用反向的音效。这样在正反向判断上我们可以做到快速切换状态。下图是在GameParameter Editor的工程截图。
为了确保声音同时播放不重叠用到了Wwise的Blend容器,在Blend容器中控制了音频的播放位置。这个位置用来确认同时播放时不会出现音频叠加播放避免两个声音都播放的情况。下图是在Blend容器中的工程截图。
如何精确记录声音播放时间的位置
为了能精确记录声音的位置,上述中已经告诉大家我们已经把音效制作成一正一反两条音效同时播放来匹配游戏中的时间线。这样的做法是为了可以量化声音播放时间的百分比,然后通过wwise的SeekOnEvent API函数来精确按照百分比播放时间。下图中可以看到这个函数的详细使用方法。
根据这个方法就只需要记录当前动画与声音播放的百分比位置,在下次触发NPC逻辑前读取记录到的信息就可以精确还原到上一次操作的位置。
女儿时间
如何表现时间的渐变
游戏中女儿出现是会让静止的时间恢复正常流逝,并出现渐变效果。下图中演示了这个渐变效果的过程。
父亲时间时整体画风是黑白风,为了表现静止的状态我们没有播放当前场景中的环境声。在控制女儿的时间时,女儿第一次加入的场景会从黑白色渐变成有色彩的状态。为了配合游戏的艺术效果在声音上我们也是配合游戏的效果,做了一个场景的环境声渐变。为了让效果更好我们把环境声单独的分开了每层,从单独的空气在到场景中每个小物品小动物我们都做了分层,根据渐变的效果慢慢让声音有一个从无到有的过程。
通过GameParameter定义了0-1的值,然后与场景大小做了百分比的定义,这样可以通过女儿移动的位置信息来播放当前位置的环境声。
在Blend容器中把分层的环境声通过音量线做淡入的效果然后把所有环境声混合叠加到一起实现了这个效果。下图中可以看到工程中的截图。
静止动画的延展
女儿在游戏中有一套自己的逻辑线,这条逻辑线只针对女儿,父亲不会触发这些逻辑。
在操纵女儿时,女儿会继续播放当前父亲未播放完毕的逻辑。例如场景中的NPC在父亲阶段时时间播放了30%。那么女儿第一次走到这个NPC附近时,就会让这个NPC的声音从当前30%的位置继续播放完父亲的逻辑。在根据这个父亲的逻辑阶段判断他自己的逻辑。这样也是为之前说到的蝴蝶效应做了延续。
在下图中我们可以看到,女儿出现在场景中后,警察继续了父亲之前的逻辑,等逻辑播放完以后他会根据之前的情况判断是否抓住小偷。女儿的动画是循环播放的,在这个情况下我们必须停止当前声音的播放,避免出现声音一直循环播放产生的听觉疲劳。
配音的问题
游戏中很多人物的语音我们通过语气助词还原了当时人物的各种情绪,语气助词可以很快的让玩家感受到游戏NPC的各种情感与人设。设计之初我们其实考虑过用配音去填补。但是与制作人沟通后制作人说了两个情况,一个是游戏中的很多对白容易暴露隐藏结局,这款游戏是一个多结局的游戏。另一个是对于一款小成本的独立游戏来说资金不允许,所以我们取消了对白,用语气词来代替。
为了在没有配音的情况下也能让游戏中的人物生动的表现出自己的人物设定。我们选择了用语气词来表现。例如游戏中的中年绅士,其实在游戏中他的人设是一个不好相处的贵族小老头,我们用了那种很尖酸刻薄的语气来表现出来,从最开始的接触就完全的表现出人物的一些特性。
对应游戏的功能
如何通过手柄按压力度控制声音的播放速度
游戏中会通过手柄的力度控制逻辑时间的加速与减速过程来配合游戏画面,上图中展示了游戏中的加减速过程。
我们通过给全局声音增加Wwise自带的 Time Stretch效果器去制作了加速与减速的过程。下图中定义了0-1的值,与手柄力度进行换算来更改时间拉伸率。
游戏中画面的减速效果是10倍的效果,TimeStretch可以把声音拉伸15倍,并在播放过程中平滑更改,不会产生副作用,按照原始声音时长的百分比去拉伸。100对应无时间拉伸200对应两倍时长依次类推我们把手柄最大按压力度的值定到100,最低速度时定义到1100这样可以保证时间的速率是根据动画对应的。图中可以看到在Effect Editor的工程截图。
我们将在下期内容分享《Clocker》的音乐设计过程,敬请期待!
评论