LOL英雄聯盟將重新建構「彈道技能」系統代碼 官方設計師首次詳談設計細節 ! !

現象級產品的誕生不是偶然的,從這些技能設計的深入推敲我們能夠略見一二。

圖片來源:網絡

對於動作類、MOBA類遊戲而言,技能的設計至關重要,技能設計的好壞通常直接關係到遊戲體驗乃至產品成敗。然而真正能夠把技能設計細化到單獨一套「彈道體系」的遊戲則鳳毛麟角。作為行業翹楚的《英雄聯盟》在最近一次更新中,徹底重構了「彈道技能」體系的代碼,從各方面重新優化了設計。

Riot Games也在官方技術博客中分享了此次優化的經驗,包括「彈道技能」舊體系層級分類和新系統設計的理念等。從中我們能看到《英雄聯盟》開發團隊對設計細節的把控、對表現標準的要求都十分到位,這當然也是遊戲能夠成為同類標杆的重要原因。葡萄君編譯了博客全文,希望對做類似設計的從業者有所幫助。

新彈道技能體系的來源

各位操作嫻熟的召喚師,大家好。今天我們來談一談飛彈——或者說彈道技能的一些技術基礎。過去的幾個月里,我們對《英雄聯盟》(下簡稱LOL)中的彈道技能做了一系列改動(見本段後)。當然如果我們的工作做得到位,玩家在遊戲中是體會不到明顯變化的。不過雖然表現不明顯,這次的技術改動還是讓我們有不少收穫,也為後續的一些設計內容提供了可能,所以我們想分享一些更深入的內容。

從技術角度來講,其實說來話長。我們梳理後台代碼有一段時間了,近期的目標是「線性彈道技能」這個具體方向。你可以把它理解成有投射軌跡的飛彈,比如伊澤瑞爾的Q/W/R都是這種線性彈道技能,而他的普通攻擊則不是。在我們講具體細節之前先說一些改動:這次重構代碼旨在解決兩個問題。一是修復某些彈道技能會直接穿過單位的bug;二是技能的擊中判定應該是基於單位碰撞體積而非模型的中心點。

伊澤瑞爾的Q技能「秘術射擊」和普通攻擊

但描述彈道技能和用代碼實現彈道技能之間有非常大的差距,各式彈道技能的設計也是不同的,這是問題所在。

我們雖然專注在一些代碼的工作上,這些改動能修復很多問題,但不是所有。比如有時候看上去是彈道技能可能只是一個拋射的小兵——就像辛德拉的技能那樣。這是我們第一次優化彈道技能的代碼,很多嘗試還不是最終解決方案。

辛德拉的技能「驅使念力」

之前舊的代碼體系很混亂而且難以調整,而新的體系能夠讓我們實現很多有趣的功能,比如這樣:

當然我們不是要把技能做出這樣,只是展示一下在當前的代碼體系下我們能過達到的效果。

LOL複雜的飛彈分類體系

你可以放大這張圖,但就像電子音樂不重歌詞那樣,我們想要強調的並不是其中的文本,而是宏觀的結構概念

遊戲中的彈道技能不像飛彈引導系統那樣複雜,但一些複雜的飛彈運動方式還是讓改動變得有風險。簡單來說,這張結構圖是我們劃分出的彈道技能分層,不同部分對應不同技能的飛彈類別。這些不同類別的功能性有時是共享的,有時候則是直接複製的,還有更多時候讓人覺得很混亂。通過整合相近功能性顏色代碼,這張表從水平的角度打散了這些飛彈類型。比如說,如果你想要了解彈道技能飛彈的碰撞追蹤,你需要逐一瀏覽這些標成粉色的代碼,它們分散在這張表的各處。

圖標最頂端的位置是我們稱之為「基礎飛彈」的部分,它們是這些分級的最底層、也就是遊戲里最簡單的飛彈類型。具體來說就是:這種飛彈會飛向某個位置或某個單位,只有當飛行過程結束時才會生效。(遠程)自動攻擊、防禦塔攻擊都屬此類。在技能中,庫奇的Q、吉格斯的R技能也是同理,它們的飛行方式簡單直白——追蹤目標、然後判斷飛彈的指向地點、之後判定是否擊中,沒有其他額外的元素。

庫奇的Q技能「磷光炸彈」

吉格斯的R技能「科學的地獄火炮」

下一個比較大的部分我們稱之為「線性飛彈」,也就是通常玩家口中的「非指向性技能」。比如伊澤瑞爾的Q/E/R技能。但這其中有一些讓人意外的地方,亞索的風牆(能阻擋敵方的彈道技能)也屬於一種線性飛彈技能,這聽起來有點諷刺。

伊澤瑞爾的Q技能

亞索的風牆「風之障壁」

線性飛彈的運行邏輯要比基礎飛彈複雜得多。舉個例子,有的技能會在飛彈運行中擊中目標、隨後返回施法者(比如德萊文的大招),也有的會像像落地生根那樣留在地表(比如婕拉的「纏繞之根」)。那麼把這樣諸多的行為邏輯都歸於一個體系中顯然是不妥的。但從另一個角度來說,線性飛彈其實是基礎飛彈的衍生體系。所以線性飛彈繼承了基礎飛彈所有的功能,但通過不同的方式表現了出來。這就讓我們在優化整體彈道技能的時候面臨了一些風險,因為一旦我們調整了基礎飛彈,線性飛彈的體系就有可能崩潰,崩潰的形式也可能多種多樣。

德萊文的大招「冷血追命」

婕拉的「纏繞之根」

圖表的底部是我們稱之為「環形飛彈」的部分,比如黛安娜的Q和W技能、阿狸的W技能,這些技能的運行方式類似於線性飛彈技能,只不過是呈環形運動的。它們同樣源於基礎飛彈技能,而它們的擊打方式則與線性飛彈一致,當然運動方式和二者都不同。繪製這張圖表的時候我們發現,在線性飛彈中修復的bug也同樣從環形飛彈中消失了。可見原來的設計在複製代碼的同時也複製了這些bug,這也是我們對「複製粘貼」這種事需要警醒的。

黛安娜的Q技能「蒼白之瀑」

阿狸的W技能「妖異狐火」

嗯,這只是個比喻

簡單來說,LOL中的彈道技能系統原本很複雜,內部錯亂糾纏(就像一盤意面一樣),而且比較脆弱。但彈道技能是遊戲中非常重要的一個部分,我們必然要想辦法優化整個繁雜的系統。所以我們用nuke徹底重寫了系統,從最底層、最基礎的部分開始,這樣我們才能規避此前哪些問題。

重構彈道系統代碼

關於重寫彈道技能系統我們總結出了4點核心原則:

類功能要在代碼層面體現出來以避免誤解。 不同功能組之間的相關性應該被最小化同時要顯著地標明。 推理論證飛彈的行為邏輯不應該成為困難。 把那些特殊的行為方式從常規方式中乾淨利落地剝離出來。

我們團隊列出了一個清單,清單的項目主要是「彈道技能的飛彈會做什麼」。團隊計劃在重構代碼的過程中逐一突出這些項目,這個清單如下所示:

移動:飛彈會抵達某些地點。 擊打:飛彈擊中物體。 目標追蹤:飛彈飛向可移動物體。 腳本介面:設計師具體設計飛彈如何運動、擊打等。 可視性:飛彈可以被某些人/物體看見,而對其他人或物不可見。 音畫效果:通過這些來表現到底發生了什麼。

參照這個名單我們開始重寫整個彈道技能系統的代碼,每一項都針對飛彈運行構建了相應的元素。隨著設置工作的深入,我們會不斷地重新評估各個分支,並且在抽象概念不能實現目標時適時作出調整。舉個例子,我們把目標追蹤的邏輯融入了到移動相關的代碼中,因為我們發現他們有很強的關聯性。我們還把腳本介面融入到了飛彈的基礎層面,因為我們發現沒有必要在不同飛彈之間做這類區分。最後我們做出了這樣一個彈道系統,圖表化的表現形式如下所示:

我們將第一個圖標稱之為「彩虹一樣的嘔吐」,而這個就只是「彩虹」:

彈道技能優化對LOL意味著什麼

當相關工作都結束、開始總結的時候,我們發現了兩個最顯著的收益。首先飛彈相關的代碼不會再給我們的程式設計師帶來困擾了,bug等缺陷現在變得易於追蹤和修復。考慮到有些缺陷此前長期無法修復,當前的解決方案已經看到了比較實際的好處。

比如說有展示飛彈直穿單位這類bug的視頻,我們曾經對著這些視頻一臉懵逼找不到原因。在一些非常罕見的情況下,這些bug出現時會從深層次上影響遊戲。但當時我們完全沒有辦法重現這個問題或是思考任何解決方式,只能暫時擱置。不過把所有的飛彈碰撞(的場景)整合到一起的時候,一些情景會使得碰撞失效,這時候會更利於觀察分析。梳理過這些內容之後,我們對設計飛彈命中目標、命中方式有了很高的自信。

當然,儘管我們修復了諸多的bug,彈道技能的飛彈直接穿過單位的情況或許還會出現。不過我們認為,以後類似案例的原因可能更多是出於單位位置同步上的錯誤,而非彈道技能碰撞判定的問題。

其次,除了減少缺陷、減輕對程式設計師的折磨之外。第二點、也是更重要的一點收益——就是我們在彈道技能設計的發揮空間更大了。有了新的體系之後我們不用再重複以前繁瑣的過程,即為了一種運動方式不同的彈道技能專門做一個飛彈的分類出來。現在我們可以更隨意地做一些瘋狂的設計。下面的一些gif圖就是很好的例子,當然這只是舉例說明我們能做到,並不代表我們要在遊戲中實裝。

德萊文的飛斧可以在空中自動攻擊:

維魯斯的攻擊方式也可以調整成這樣:

讓艾希射出一個六邊形:

這些都是可以實現的功能。

喜歡嗎 趕快分享出去吧 !

文章來源: https://www.twgreatdaily.com/cat100/node1011977

轉載請註明來源:今天頭條