【我?guī)旺椊切辀ug】飛出場外的boss:論天外飛仙是怎樣練成的
這個系列內(nèi)容大概是科學(xué)分析一些游戲bug或"bug"的原理并給出可能的解決方案
往期內(nèi)容歡迎查看本人專欄
本期內(nèi)容比較短,所以作為半期
內(nèi)容只有一個:新活動中的boss,杰斯頓·威廉姆斯,是怎么飛出場外的?

這個bug的詳情可以看UP主泥萌都是托的迫害視頻
概括一下就是,推動重生期間的杰斯頓,可以使杰斯頓以推的初始速度無限進(jìn)行勻速位移,同時位移期間無視地形,甚至可以飛出場外
首先需要解決的問題是,為什么重生期間的杰斯頓,受到推力會無限進(jìn)行位移?
這個問題其實不難解釋
推力的機(jī)制是,對敵人的rigidbody施加力,隨后將敵人的狀態(tài)機(jī)切換至unbalance
進(jìn)入unbalance狀態(tài)時,會激活敵人的物理碰撞箱
只有在unbalance狀態(tài)下,敵人每幀會根據(jù)摩擦力更新移動速度
但是重生期間,敵人處于reborn狀態(tài)
而reborn狀態(tài)下,狀態(tài)機(jī)是無法直接切換至其它狀態(tài)的(需要切換的話必須帶有force屬性,但直接切換的方法沒有這個屬性)
因此造成的后果是,敵人的rigidbody被施加了力,獲得了速度,unity引擎控制著敵人根據(jù)速度進(jìn)行著位移
然而,狀態(tài)機(jī)仍處于reborn,并沒有被切換至unbalance
這導(dǎo)致,敵人的物理碰撞箱沒有被激活,敵人不會根據(jù)摩擦力更新移動速度
直接表現(xiàn)就是敵人會按初始速度做勻速位移,還可以無視地形飛出場地...
然后是第二個問題,為什么只有杰斯頓會觸發(fā)這個bug?
迫害視頻中有說明,除杰斯頓外,其它敵人進(jìn)行重生,都會使已經(jīng)鎖定了目標(biāo)的水炮丟失目標(biāo)
然而,我閱讀了重生相關(guān)的代碼,但并沒有發(fā)現(xiàn)哪里會使已經(jīng)鎖定的目標(biāo)丟失
我又嘗試對比了霜星和杰斯頓的重生天賦,發(fā)現(xiàn)不同的地方只有一個名為_hpRechargeRatio的變量
這個變量的作用是,決定重生期間的血條,從什么時候開始回復(fù)
霜星的這個變量值為0.5,意味著霜星的血條將從重生進(jìn)行至一半時開始回復(fù)
杰斯頓的這個變量值為1,意味著杰斯頓的血條從重生一開始就會進(jìn)行回復(fù)
(此外關(guān)于這個變量,霜星/大丑/梅妃鳥/黑蛇首次重生為0.5,左手為0.2,愛國者為0.85,黑蛇第2次重生為0。如果仔細(xì)觀察會發(fā)現(xiàn)血條開始回復(fù)的時刻一般都是對應(yīng)boss站起來的時刻,換言之這個變量是演出效果用的)
這里可以進(jìn)行一個推測
丟失目標(biāo)并不是因為重生,而是因為hp歸0
敵人存在一個隱藏機(jī)制,hp為0時無法選中,而且選中了也會丟失目標(biāo)
隨后fux2大佬對這個猜想進(jìn)行了驗證,證實了這個隱藏機(jī)制的存在,此處特別感謝
那么只有杰斯頓不會在重生期間被丟失目標(biāo)的原因也很清楚了
因為除杰斯頓外所有會重生的敵人,重生時都有一段hp為0的時間
這段時間內(nèi),即使被鎖定了,也會被丟失目標(biāo)
而杰斯頓重生時因為會立刻恢復(fù)hp,因此不存在hp為0的時間,即使進(jìn)入重生也不會導(dǎo)致目標(biāo)丟失
最后是修復(fù)方案(三選一)
1. 把杰斯頓的_hpRechargeRatio變量值調(diào)小一點,讓他有一段hp為0的時間。但是這種方案治標(biāo)不治本
2. 給enemy狀態(tài)機(jī)的reborn狀態(tài)加一個unbalance_immune的abnormalMask。這樣重生期間免疫位移,自然不會出問題
3. 修改knockback的方法。先切換狀態(tài)機(jī),判斷切換成功后再addForce
本文原載于NGA:https://ngabbs.com/read.php?tid=24720316
作者為本人
此專欄以CC BY-NC-SA 4.0協(xié)議發(fā)布