造物者说:全新弹道系统 实现心形轨道

时间:2015-08-24 15:32 作者:constancequinn 手机订阅 神评论

新闻导语

设计师发表博客,向大家详细讲解了全新弹道系统。

constancequinn@17173原创编译,转载请注明作者与出处

missilesheader.png

 

联盟中新的弹道系统

召唤师们,Brian "Penrif" Boss在这里和你们聊聊联盟中弹道系统的新机制。我们在过去的几个月中调整了弹道的一些算法(就像在最近的更新日志中提到的那样)。如果我们的工作得当的话,你在游戏时应该不会感受到什么变化。不过就算如此,新机制为游戏带来的新发展着实让我们兴奋,所以我想和你们分享一下相关的更多细节。

之前的系统错综复杂而且几乎不可能重做,而新的系统让我们可以轻松的做些蠢事,就像下面这样:

ashe-heart.gif

艾希之心

先说一句,我们不是要改动艾希的万箭齐发。这只是我在几小时内吃着医生开的止疼片,随便做做就完成的,只是想说明新的系统可以把一切都简化,不用花太多功夫就可以完成很多以前很麻烦的动作。

 

超级复杂的旧弹道系统

为了让你清楚的认识我们在和什么打交道,我就给你一张表看看,这上面写得就是以前的弹道系统每一帧执行的方式:

missile_flow_before.png

(你可以放大不过估计这就像电子乐一样-----里面的字重要么?)

当然这和真正的导弹导航系统相比,是没那么复杂啦,不过这让人头疼的算法确实让任何改动都有所风险,仅仅是因为它本身的复杂性。简单来说,你现在看到的就是每一种弹道的类别,每一个都代表了一种不同类别的一组弹道方式。而来自这些类型的功能,他们时而共享,时而重复---不过都经常让人困惑。这张表把这些弹道类型横向排开,功能类似的就用颜色标出。举个例子,如果你想知道弹道碰撞轨迹,你就不得不看每一个粉色的代码——就是那个几乎到处都是的粉色代码。

最上面的框里就是我们所说的“基础弹道”,他是整个弹道系统的根基。也就是那些最简单的弹道:这些飞弹飞向指定位置或者指定目标并且当飞行结束时被触发。平A和防御塔的攻击都属于这个类型,还有像飞机的Q和炸弹人的大招这样的技能也属于此类型。他们的算法都很直接,飞弹跟踪目标,然后评估飞弹该向哪里移动,然后看他们是否可以攻击到目标。就这么简单。

下面那个大框是“线型弹道”,大多数玩家会叫他非指向性技能——比如拉克丝的Q,艾希的万箭齐发,或是EZ的所有技能。也有一些让人惊喜的技能也出于此,比如亚索的风墙:它就属于线型弹道,挡弹道的弹道,够讽刺的了。

线型弹道比起基础弹道要复杂的多,举个例子,他们在飞行过程中可能击中目标,也可以回到施法者处(如德莱文的大招),或者技能贴近地面(如婕拉的E)。把这些不同的技能都混为一类确实有点作死,不过线型弹道还和基础弹道有密切联系。由于使用了基础弹道的系统预设值,导致线型弹道继承了基础弹道的功能性,不过线型弹道的使用方法略微不同。这就让我们很尴尬,因为当我们想要改动基础弹道的算法时,就难免会牵扯到线型弹道,这就把事情搞得更加复杂了。

那个底下的小框里面装着3个圆形弹道:皎月的Q和W,狐狸的W。他们的机制和线型弹道相似,但飞行轨迹为圆形。它们也来源于基础弹道,在打击方式上和线型弹道相似,而移动轨迹不同。在做这张表的时候我发现了一些bug,这些bug使得线型弹道无法变成圆形。所以复制这些代码就相当于也复制了这些bug;复制狂魔永远的痛啊。

pasta.jpg

让我们形象的感受一下这种弹道系统吧。大概像这样

总之,lol中的弹道系统十分复杂但是毫无必要,自我纠结而且十分脆弱,改也改不得。既然弹道在这个游戏中是一个很大的设计区域,那么我们就必须简化它,从而使其更容易被改动。

最后我们决定把原先的系统**重做,这是最简单粗暴的方法。

fromscratch.jpg

 

一张白纸

重做时我们本着4个核心原则:

1 相似的功能性应该在写在同一个代码里,来确保理解方便

2不同功能组之间的依赖性要最少且划分清楚

3弹道基本的形态功能应该要简单明了

4某些特殊弹道要和主要算法直接分离

我们的团队先是确定弹道的核心问题,然后分别对这些问题做出计划。看得出我很喜欢列清单(上面那张你看不懂的表就是我列的,啦啦啦), 所以我也要陈列一下弹道的工作原理组成:

移动:飞弹飞向一个地方

碰撞:飞弹打击目标

目标追踪:飞弹飞向可移动的目标

脚本交互:飞弹的行为完全由设计师设计

可视性:飞弹的视觉效果

视觉特效和声音:你们都能听到看到的那些

我们就本着上面这些原理进行重做,然后给每个弹道都写入内容。随着工作的逐步进行,当概念设计无法满足需求时,我们开始再次评估然后做出调整。比如,我们把目标追踪的概念加入到移动的代码里,因为我们发现这两者的问题有紧密的联系,再比如我们把脚本交互加入到通用的弹道基础里,因为我们觉得不需要在不同的弹道中进行区分。

最后,我们做出了这样的系统:

missile_flow_after.png

我们把第一张表称为“五颜六色喷吐物”,而这张表简直就是由彩虹构成的。

rainbow.jpg

彩虹可是绝佳的建筑材料

 

这对LOL意味着什么

最后我们的工作带来了两大好处。第一,弹道代码再也不会让我们的程序员感到棘手了,因为发现和解决代码问题变得轻松多了。这为那些原先被视为无法根除的问题,提供了解决的可能性。

例如,我们会看到一些视频里出现飞弹直接飞过目标且未击中的情况,这让我们感到很尴尬。虽说这是小概率事件,但这个bug很有可能决定一场游戏。我们无法重现这个bug,我们也不知道为什么这种情况会出现,所以我们只能把它暂且放下然后继续前进。但是,把所有的碰撞都用同一代码运算,那么一些会使得碰撞失效的情况就很容易被捕捉。等把那些情况处理完,我们就会很有信心的说每一颗飞弹都会击中它该击中的目标。

不过还是给自己留条后路,那种飞弹命中失败的可能性还是存在的。不过我怀疑这可能是由于某些单位位置同步性的错误而导致的,并不是弹道碰撞带来的问题。

当然让程序员轻松一点并让bug少一点,固然是很好,但是第二个更棒的好处在于,我们可以在弹道上更快的做出很新奇的调整。现在我们不用把整个弹道系统都改了才能更变弹道的移动方案,所以我们现在可以轻而易举的做出很多疯狂的改动。下面有一些这些所谓疯狂改动的展示,不过这些都不是真的要上线的:不过是某些程序猿犯蠢的结果罢了。

Draven-LoopityLoop.gif

**爹转啊转

我们把德莱文的平砍加了2圈,看上去挺适合德莱文的张扬个性

Varus-Hearts.gif

稍微改动一下弹道的飞行轨迹点,维鲁斯就在天上画出爱心咯

ashe-hexagon.gif

六边形是最优多边形

现在有没有好想射点什么啊?\o/

相关阅读:造物者

英雄联盟

扫描二维码

微信公众号

最强攻略

热点专题

全球新闻

签到成功!

连续签到: 天  累计签到: 天

更多»今日抢签到排名