想写一篇关于LUNA人物走路系统的开发日志有一段时间了。随着走路系统的顺利更新完成,我们觉得也差不多是时候可以和大家分享一下这个痛苦而快乐的过程了!
我们可以先设想一下其他游戏人物是怎样移动的,假设有一个方盒,如果需要把它从A点移动到B点,最典型的方式就是用编程来实现这个位移。然后把方盒替换为游戏人物走路循环动画,这样这个人物看上去就会“跑起来了”。
但是如果你仔细观察这个移动,会发现其实那更像是对“走路”这个动作的模仿——因为人物在“走”的时候,并没有扎实地踩在地面上,而是在地面上来回滑动,而且这样一来这种偏电脑程序实现效果和LUNA其他手绘动画的风格多少有点出入。即使我们通过调整人物走路起步和停步的速度,让走路的动画看上去更自然,可在游戏里,还是会发生人物滑步的情况。
大多数游戏采取的做法像在8-bit版本《洛克人》游戏中的做法,即人物通常会在地上滑动非常大的范围,这样看上去人物在移动时更加顺滑和平稳。
但在现实生活中,我们并不像游戏人物展示的那样滑太空步,而是一步步往前走,我们在走路的过程中,在进行抬腿的阶段时并不会有太大的位移,只有在把脚往前踏出我们身体在走路进行抬腿动作时并不会往前或往后滑动,只有在把脚往前踏出后,身体才真正在移动距离上有了比较大的变动。如果我们分解一下这组八帧的走路动画循环,就会虽然发现每个腿的动画是四帧,但真正明显前移的只有两帧。因而这对程序表现走路动画就一定的困难,因为每一帧的移动位并不是匀速的。(见下图)
我们其实在LUNA开发中,非常希望能更好地表现人物动态,更接近我们现实生活中的走路方式,一步一个脚印。我们非常希望能以更质朴的方式,营造出一个真实而生动的LUNA世界。
那我们需要解决什么问题呢?例如在游戏关卡中,角色需要和场景物件进行互动,那我们就需要角色可以停留在任何一个具体的点。但单单使用一个走路循环动画,是没有办法让角色停留在某个特定点的,于是我们想了一些办法来解决这一问题。首先,我们总共做了8组走路距离不同的动画,假设一组完整的走路动画的移动距离为X,现在人物可以在1/2X, 1/3X, 1/4X, 1/8X等这些点停住。我们现在有了这8个小微步停顿点,对他们进行排列组合,程序就又可以以更适合的方式来控制角色想要停住的地方。
同时,现在人物在停止走路的时候,并不会马上瞬间停住,而是在快要到达终点时,会更像一个真实走路要停下来时,开始缩小脚步。如果需要移动的位置非常小,人物还可以在小距离间跨步,就像我们平时在马路上迈过水坑的样子。
好,接下来问题又来了,即使如此,目前人物还是不能随意停止在任意一个位置。因为距离是可以被无穷细分的,难道我们就需要做无穷多的动画来解决这个问题吗?这不科学!
于是在一番测试和调整后,我们决定了以五个像素点的单位为最小移动距离。这个单位是目前游戏分辨率上已经非常非常小了,并且也足够满足我们的需求。然后在这个基础上,我们将目前走路系统,所能覆盖的距离的多余的那一部分(类似于除法里除不尽要余下的那部分距离)再分配到这八组步行动画中的某些过渡帧上。
综上所述,这大概是LUNA开发以来最具挑战的工作之一,既费时又费力。我们在优化的过程中也不停地问自己:怪不得大多数的开发者不会以这个方式搭建走路系统……不过也正是因为克服了这些挑战,我们才得到了成长,更是学到了宝贵的开发经验。尤其当我们终于坚持以自己独特的方式攻克下这个技术难题时,那种成就感是非常珍贵的。
希望我们可以通过这个全新的走路系统,配合全手绘的动画与背景,给玩家营造一个不但魔幻,也同时让人感觉真实的世界。独立游戏开发有时时会陷入对于未知的无措和紧张,希望这个分享可以帮到一些需要的人!
很少看到有这么注重动画的制作组~
感谢分享心得