【译】英雄联盟背后的新弹道系统
英雄联盟背后的新弹道系统
大家好,精于射击的召唤师们,Brian "Penrif" Bossé在这里和大家谈谈弹道背后的新的技术基础。在过去的几个月中,我们推出了已完成的新弹道(比如在http://na.leagueoflegends.com/en/news/game-updates/patch/patch-512-notes#patch-game-systems文中提到的)。如果我们的工作做得不错,你在游戏时不会注意到这些改变。即便如此,我们对这个游戏新解锁的内容还是很兴奋,我想要和你们分享一些这背后更深层次的内容。
旧系统乱作一团,我们几乎不能与其工作,然而新的系统让我们像这样轻易地做傻事。
提醒你,我们正打算让艾希的齐射变成这样。这只是一些当我在头疼如何展示我们不需要许多努力就能做到的事情,或是在集中注意力时,或是在痛苦时。
弹道:复杂的惊人
给你们一个我们正在解决的想法,让我给你一个图展示每帧执行的弹道系统。
(我想让你们放大或增强这张图片,但是就像在电子音乐中一样—这些话并没有什么意义)
虽然不是真正的导弹制导系统一样复杂,这种复杂的流动使得改变像它本质的那样有风险。简单地说,我们在这里看到的时多层次的弹道类型,每一个都表示一个不同的弹道。这些不同类型的弹道产生的作用有时是共享的,有时是相同的,更多的是令人困惑的。这张图在平面中用相似功能的颜色编码展示了这些弹道类型。比如说,你想知道弹道如何解决碰撞跟踪,你需要便利地检查在各个地方的所有的粉色编码。
图中顶部的格子中包括了我们称作“基础弹道”的层次结构的基础。这些都是最简单的弹道:他们飞向一个位置或一个单元并且只有运动时才被激活。自动射击和炮塔的射击都在此类,就像库奇的Q和吉格斯的R。它们径直地飞向他们的目标,然后评估弹道应该到的地方,然后看他们是否飞向目标。就是那么简单。
图中下一个大格子包含了“线性弹道”,包括大部分人说的“技能弹道”例如拉克丝的光之束缚,艾希的万箭齐发,或是伊泽瑞尔做的大部分事情。这个类别中也有一些惊喜。就像亚索的风墙,它的嘲讽可能会让线性弹道有些受伤。
线性弹道比基础弹道有更复杂的行为。比如说,它们可能会按计划攻击目标,然后回到施法者的手中(比如德莱文的斧头),或者是拥抱大地(就像婕拉的绞杀之藤)。从一处把这些不同的行为放在一个目标的身上是很邪恶的,但线性弹道作为基础弹道的衍生物进一步发展了。因此,线性弹道在默认情况下继承了所有基础弹道的功能,但使用时并不相同。这种改变基础弹道带来的各种破坏线性弹道的风险使我们很头疼。
底部的3个小群体是给我们的三个圆形弹道的:戴安娜的Q和W、还有阿狸的W。他们表现的和线性弹道很像,但是以圆形轨迹在运动。它们来源于基础弹道,而且除了运动外和线性弹道惊人的相似。在做这个图的过程中我们发现了一些线性弹道的没有让他们按圆形轨迹运动的bug。复制代码也会复制它的bug,这就是这一团像意大利面一样的数据给我们带来的痛苦。
(一个可以直观看到的弹道系统运作的替代品)
简而言之,弹道系统在英雄联盟中是不必要地复杂,它的本身很纠结,也很脆弱。作为一个游戏的弹道它有很大的设计空间,显然,我们要让它们更容易处理。
我们选择的解决这个问题的方法就是毁灭这个系统然后从头重写它。就是唯一确定的方法。
一张白纸
重写系统有以下四个原则:
· 就像功能应该被集中在代码上以便于理解
· 不同功能组之间的依赖关系应该是最小化且便于理解的
· 推导弹道一般会做什么应该是容易的
· 特殊情况的行为应该能简明地从主要执行路径区分出来
队伍从区分弹道的核心关系着手,并计划在内容来独立地解决这些问题。很明显我喜欢列表处理事物,所以一下就是弹道会做的事情的列表:
· 移动:弹道去的地方
· 碰撞:弹道打击目标
· 目标跟踪:弹道朝向运动的事物移动
· 脚本接口:弹道需要设计师告诉它们该做些什么
· 可视性:弹道可以被某些事物看见而不是其他的
· 视觉效果和声音:你们要看到和听到发生了什么
在有了每一项的组件后我们可以在飞行过程中构建弹道甚至是互换飞行路径,我们开始根据这个清单重写弹道系统。随着我们工作的开展,我们不断重新评估这些分组,当这些抽象的东西不再为一个目标服务时做一些调整。比如说,当我们发现它们的关系捆绑时,我们在运动代码中改变运动跟踪逻辑。当我们发现不需要区分不同的弹道时,我们把脚本接口到常见的弹道基础上。
最后,我们做出了像下图这样的系统:
我们把第一张图叫做“彩虹喷发”,这就是来源于彩虹的。
彩虹成为了一个优秀的建筑材料
这对联盟来说意味着什么
所以当面我们转入正题,这项工作带来了两个主要的好处。首先,由于缺陷更容易被找出并修复,弹道代码不会再让我们的程序员如此头疼。被认为很长一段时间不合适地解决一些缺陷已经话费了我们一些资金。
例如,我们一直在苦恼于一些视频显示弹道穿过了他们的目标。在一个小概率事件发生时,它严重地影响了这个游戏。无法重现这个问题并且无法诱导这个问题发生,我们唯一能做的事情就是把他们抛之脑后然后继续工作、但是,把所有的弹道碰撞集中到一起然后整理,几个容易导致碰撞失败的场景变得容易找到。在整理这些之后,我们已经有了很大的自信,弹道应该会像它们应该做的一样命中目标。
一些情况下弹道飞过一些目标的情况仍然存在保持了我的激情。但是我怀疑那些来源于错误的单位同步位置,而不是弹道的碰撞检测。
虽然让程序员更轻松、有更少的缺陷是好的,第二个并且是最大的好处在于我们可以用弹道更快地做一些新的事情。为了建立一个新弹道只需要改变一些移动,无需建立一个全新的弹道,我们可以让他们做各种疯狂的东西。我向你们集中展示了一些例子。这并不代表我们研发的想法;它们只是我们给工程师的一些时间和自由的结果。
https://engineering.riotgames.com/sites/default/files/Draven-LoopityLoop.gif
我们将德莱文的普通攻击放了一个圈来取乐,它在德莱文身上看起来很酷。
https://engineering.riotgames.com/sites/default/files/Varus-Hearts.gif
我们还轻微地修改样条中心控制点,我们给维鲁斯加了一些爱心。
https://engineering.riotgames.com/sites/default/files/ashe-hexagon.gif
六边形是最跑的更远并能射到任何物体的合适的形状o/。
· Brian “Riot Penrif” Bossé
· Anoop “Noopmoney” Kamboj
· Kevin “kbox” Borer
· Vasiliki “vLemon” Siakka
· Abe “Riot Meyea” Nguyen
· Jessica “Safelocked” Nam
· Richard “Riot Asyrite” Henkel
Jimmi的Mixing salt dough在 CC BY 2.0中授权
Jessica Spengler的Spaghetti alla chitarra 在 CC BY 2.0授权
Steve Snodgrass的Rainbow在CC BY 2.0授权
由Brian Bossé发表
原文链接https://engineering.riotgames.com/news/behind-leagues-new-missile-system
原文作者未做版权声明,视为共享知识产权进入公共领域,自动获得授权。