欢迎光临散文网 会员登陆 & 注册

【我帮鹰角修bug】飞出场外的boss:论天外飞仙是怎样练成的

2020-12-19 16:45 作者:等--等灯等灯  | 我要投稿

这个系列内容大概是科学分析一些游戏bug或"bug"的原理并给出可能的解决方案

往期内容欢迎查看本人专栏

本期内容比较短,所以作为半期
内容只有一个:新活动中的boss,杰斯顿·威廉姆斯,是怎么飞出场外的?

什么叫天外飞仙啊

这个bug的详情可以看UP主泥萌都是托迫害视频
概括一下就是,推动重生期间的杰斯顿,可以使杰斯顿以推的初始速度无限进行匀速位移,同时位移期间无视地形,甚至可以飞出场外

首先需要解决的问题是,为什么重生期间的杰斯顿,受到推力会无限进行位移?
这个问题其实不难解释
推力的机制是,对敌人的rigidbody施加力,随后将敌人的状态机切换至unbalance
进入unbalance状态时,会激活敌人的物理碰撞箱
只有在unbalance状态下,敌人每帧会根据摩擦力更新移动速度

但是重生期间,敌人处于reborn状态
而reborn状态下,状态机是无法直接切换至其它状态的(需要切换的话必须带有force属性,但直接切换的方法没有这个属性)
因此造成的后果是,敌人的rigidbody被施加了力,获得了速度,unity引擎控制着敌人根据速度进行着位移
然而,状态机仍处于reborn,并没有被切换至unbalance
这导致,敌人的物理碰撞箱没有被激活,敌人不会根据摩擦力更新移动速度

直接表现就是敌人会按初始速度做匀速位移,还可以无视地形飞出场地...

然后是第二个问题,为什么只有杰斯顿会触发这个bug?
迫害视频中有说明,除杰斯顿外,其它敌人进行重生,都会使已经锁定了目标的水炮丢失目标
然而,我阅读了重生相关的代码,但并没有发现哪里会使已经锁定的目标丢失

我又尝试对比了霜星和杰斯顿的重生天赋,发现不同的地方只有一个名为_hpRechargeRatio的变量
这个变量的作用是,决定重生期间的血条,从什么时候开始回复
霜星的这个变量值为0.5,意味着霜星的血条将从重生进行至一半时开始回复
杰斯顿的这个变量值为1,意味着杰斯顿的血条从重生一开始就会进行回复
(此外关于这个变量,霜星/大丑/梅妃鸟/黑蛇首次重生为0.5,左手为0.2,爱国者为0.85,黑蛇第2次重生为0。如果仔细观察会发现血条开始回复的时刻一般都是对应boss站起来的时刻,换言之这个变量是演出效果用的)

这里可以进行一个推测
丢失目标并不是因为重生,而是因为hp归0
敌人存在一个隐藏机制,hp为0时无法选中,而且选中了也会丢失目标
随后fux2
大佬对这个猜想进行了验证,证实了这个隐藏机制的存在,此处特别感谢

那么只有杰斯顿不会在重生期间被丢失目标的原因也很清楚了
因为除杰斯顿外所有会重生的敌人,重生时都有一段hp为0的时间
这段时间内,即使被锁定了,也会被丢失目标
杰斯顿重生时因为会立刻恢复hp,因此不存在hp为0的时间,即使进入重生也不会导致目标丢失

最后是修复方案(三选一)
1. 把杰斯顿的_hpRechargeRatio变量值调小一点,让他有一段hp为0的时间。但是这种方案治标不治本
2. 给enemy状态机的reborn状态加一个unbalance_immune的abnormalMask。这样重生期间免疫位移,自然不会出问题
3. 修改knockback的方法。先切换状态机,判断切换成功后再addForce


本文原载于NGA:https://ngabbs.com/read.php?tid=24720316

作者为本人

此专栏以CC BY-NC-SA 4.0协议发布


【我帮鹰角修bug】飞出场外的boss:论天外飞仙是怎样练成的的评论 (共 条)

分享到微博请遵守国家法律