【音游技术】怎么实现花里胡哨的变速效果
墨滢-moying
编辑于 2020年10月19日 19:09

前言:如果你发现一个纸飞机飞的特别远,你也想做一个相同的,那么最简单的方法就是拿一张一样的纸,对着一样的折叠教程折一遍,这样虽然你还是不知道为什么这么折飞得远,但是研究起来就会方便很多。但是当你没有折叠教程的时候,就只能发挥自己的想象力了。最终可能你也不知道你的折法和他的折法是不是一样的,但是至少你的纸飞机飞的也蛮远的。

cut-off

翻译成人话:我想拿arc的fanmade工具研究一下arc是怎么实现复杂变速组的,但是我arc太菜了进不了DIY群。

闲话到此为止,直接进入正题。

cut-off

在讲解我们的变速方案之前,我们要先看看常见的变速是如何实现的。市面上最常见的变速,也是最古早的变速,就是bpm变速。具体原理很简单:谱面演出时,note的行进速度是由bpm决定的,bpm越高,note的行进速度就越高。

以一个经典的soft landing变速(指note突然下降到判定线前,然后再很慢的落入判定线)为例,这里我们使用的软件是malody(4K):

一个经典的通过bpm实现的soft landing

歌曲BPM为180,我们可以看到,谱子先是提升到了585的BPM,随后在下一个note之前一小段距离变为15,然后再下一个note处变为180原速。当谱面实际演出时,玩家就会看到上方的note突然极快的下降,然后在马上就要碰到判定线之前突然停顿。

通过bpm的变换,我们已经可以实现一些观赏性比较高的变速效果了,但是bpm变速存在许多问题:

  1. bpm必须是歌曲bpm的整数倍或简单分数倍,否则note会难以正确的放在节奏线上

  2. 一次变速需要设置2到3个甚至更多的bpm变化节点,通常一首变速曲会有长达50条的bpm列表

  3. 因为不能存在负bpm与0bpm,所以无法实现“谱面倒流”和“谱面停顿”效果

  4. 因为bpm发生改变,note的相对位置间隔也会改变,在编辑谱面时不够直观。同时因为之前的bpm会影响后面的节奏位置,所以无法在制作完谱面以后添加变速效果

所以我们必须要创造出一种更优秀的、更方便的变速方案。

cut-off

bpm变速的本质,是bpm改变了note的下落速度,这一点在太鼓中更加明显。

图中ka(蓝色)为变速的note

而我们的变速系统则认为:变速产生的原因不是note的下落速度产生了变化,而是谱子的流速发生了变化

这句话看起来好像是废话,但是却非常重要。在新系统中,我们认为note是“贴”在一张纸条上的,而变速是我们让纸条移动的速度变快了——这有点像是八音盒一样,本质上八音盒乐谱上的凹槽并没有移动,而是乐谱的移动速度增快了。

接下来我们需要解决第二个问题:因为乐谱的移动速度变高了,所以原本需要1秒跑完的路程,现在只需要0.5秒就能跑完(如果速率是2)。换成节奏的单位,就是原先的4分音符变成了8分音符。解决方案是:给予某一段一个新速度时,还会控制这一段的长度。

举例来说,假设我们设定第一小节第一拍到第二小节第一拍的速率为1.5,那么第一小节整体的长度也会变为原先的1.5倍。

一个简单的示例图

这样,我们就将“速度”转化为了“距离”。这样的一个转换是至关重要的,因为它可以实现变速和节奏的解耦。这样,我们改变速率不会导致节奏线和时间发生改变了,编辑变速也会更加容易。

更迷人的是:如果我们赋予某个小节(或者某一段)0速度,根据我们的公式,这一段的长度将会是0。这意味着——谱面演出到此处时,会停滞一个小节的长度,然后再继续。

更进一步的,如果我们赋予某一段负速度,那么这一段将拥有负距离——也就是谱面倒流

这些都是bpm变速所无法达到的,因为bpm是和时间有关的,因此不存在0bpm和负数bpm。

拥有了这些利器,我们甚至可以再现许多音游中“一个音符反复击打”的特效。

我们在谱面上取两个点,这两个点一前一后。为了方便说明,我们假设第一个点在第一小节第一拍(记为[1:1]),第二个点在第二小节第一拍(记为[2:1])。

根据用户设置的谱面流速,我们计算出:一个不变速的小节在屏幕上的长度是100个像素。那么点1和点2的屏幕距离应该是100像素。

同时我们也能计算出,[1:1]到[1:3]的屏幕距离是50像素、[1:3]到[2:1]的距离也是50像素。

接下来,我们赋予[1:1]到[1:3]速度-1,然后赋予[1:3]到[2:1]速度1。

很显然,根据公式,[1:1]到[1:3]的距离为50*-1=-50像素,[1:3]到[2:1]不变,仍然是50像素。

那么,此时点1到点2的屏幕距离为:(-50)+50=0像素。我们惊人的发现:点1和点2重合了。如果我们在点1和点2上各放置一个note,那么这两个note就会完全重合

同时,因为[1:1]到[1:3]的距离是-50,当谱面演出到[1:1]时,整体谱面会向前移动半个小节的长度,然后再向后移动半个谱面的长度

而又因为两个note完全重合,在玩家看来,就是一个note落下来,我击打了它以后,它又弹了回去,然后再度落了下来。

(当然,为了视觉效果,我们需要在[1:3]处做一个速度平滑,此处的谱面速度导数应该为0。不过这都是无伤大雅的要素)

cut-off

进一步的优化

当然,我们还有一些问题没法解决,比如:当某个音符被反复击打时,我们只能让这一个音符出现在谱面上,无法实现“下面是正常的4K,上面有一个note在BGM的每个drop都被打一下弹起来”的效果。以及我们无法实现不同轨道不同速度的效果。

所以我们需要在上面的理论基础上加一个小补丁,也就是layer设定(或者叫time group)。

我们可以把某一些note放入到一个新的layer中,而对于这些layer,我们可以对同一个范围的不同layer设置不同的速率因子。但是在演出时,这些layer看起来是不分离的,这有点像是Photoshop的图层的感觉——我可以对每个图层设置不同的图层效果,但是导出图片的时候并没有“图层”的感觉。

比如对于上面的例子,我们可以把这个反复击打的note放在一个单独的layer中,然后将下面的正常4K谱子放入默认的layer中,然后默认的layer速率始终为1,而单独的那个layer中则按照上文的设置方法进行设置。这样就可以实现4K谱子正常下落,一个单note反复弹跳的特效了。

同样的,对于不同轨道不同速度的变速特效,我们可以先制作好一个正常的4K谱,然后将左边两轨的note放在一个layer中,设置一个速度,然后再把右边两轨的note放在另外一个layer中,设置一个新的速度。这样双轨不同速也可以实现了。

cut-off

讲完了,思路来源于前几天从实验室回寝室的时候路上的胡思乱想,回寝室以后就在B站开了个草稿,结果过了3天才想起这个坑,于是填了。

目前还没代码,可能会用Unity加上malody的图片素材做一个简单的demo,如果效果好的话会做个视频给大伙看看。

另外因为我真的不知道arcaea的变速是怎么做的(因为arc的变速系统是4K下落中相对比较完善的 另外一个特效很优秀的是phigros),如果我的想法和arc的变速系统不谋而合的话我会很开心的。如果有内行的同学可以在评论区说说看。

以上

封面截自ÃцяøS™亞金的FULi AUTO SHOOTER自制谱视频(BV1di4y1s7uP)