造物者說:新系統令人很想射!全新彈道系統 實現心形軌道


 
聯盟中新的彈道系統召喚師們,Brian "Penrif" Boss在這裡和你們聊聊聯盟中彈道系統的新機制。我們在過去的幾個月中調整了彈道的一些演演演算法(就像在最近的更新日誌中提到的那樣)。如果我們的工作得當的話,你在遊戲時應該不會感受到什麼變化。不過就算如此,新機製為遊戲帶來的新發展著實讓我們興奮,所以我想和你們分享一下相關的更多細節。
之前的系統錯綜複雜而且幾乎不可能重做,而新的系統讓我們可以輕鬆的做些蠢事,就像下面這樣:

艾希之心
先說一句,我們不是要改動艾希的萬箭齊發。這只是我在幾小時內吃著醫生開的止疼片,隨便做做就完成的,只是想說明新的系統可以把一切都簡化,不用花太多功夫就可以完成很多以前很麻煩的動作。
 
超級複雜的舊彈道系統為了讓你清楚的認識我們在和什麼打交道,我就給你一張表看看,這上面寫得就是以前的彈道系統每一幀執行的方式:

(你可以放大不過估計這就像電子樂一樣-----裡面的字重要麼?)當然這和真正的導彈導航系統相比,是沒那麼複雜啦,不過這讓人頭疼的演演演算法確實讓任何改動都有所風險,僅僅是因為它本身的複雜性。簡單來說,你現在看到的就是每一種彈道的類別,每一個都代表了一種不同類別的一組彈道方式。而來自這些類型的功能,他們時而共享,時而重複---不過都經常讓人困惑。這張表把這些彈道類型橫向排開,功能類似的就用顏色標出。舉個例子,如果你想知道彈道碰撞軌跡,你就不得不看每一個粉色的代碼——就是那個幾乎到處都是的粉色代碼。最上面的框里就是我們所說的「基礎彈道」,他是整個彈道系統的根基。也就是那些最簡單的彈道:這些飛彈飛向指定位置或者指定目標並且當飛行結束時被觸發。平A和防禦塔的攻擊都屬於這個類型,還有像飛機的Q和炸彈人的大招這樣的技能也屬於此類型。他們的演演演算法都很直接,飛彈跟蹤目標,然後評估飛彈該向哪裡移動,然後看他們是否可以攻擊到目標。就這麼簡單。下面那個大框是「線型彈道」,大多數玩家會叫他非指向性技能——比如拉克絲的Q,艾希的萬箭齊發,或是EZ的所有技能。也有一些讓人驚喜的技能也出於此,比如亞索的風牆:它就屬於線型彈道,擋彈道的彈道,夠諷刺的了。線型彈道比起基礎彈道要複雜的多,舉個例子,他們在飛行過程中可能擊中目標,也可以回到施法者處(如達瑞文的大招),或者技能貼近地面(如枷蘿的E)。把這些不同的技能都混為一類確實有點作死,不過線型彈道還和基礎彈道有密切聯繫。由於使用了基礎彈道的系統預設值,導致線型彈道繼承了基礎彈道的功能性,不過線型彈道的使用方法略微不同。這就讓我們很尷尬,因為當我們想要改動基礎彈道的演演演算法時,就難免會牽扯到線型彈道,這就把事情搞得更加複雜了。那個底下的小框裡面裝著3個圓形彈道:皎月的Q和W,狐狸的W。他們的機制和線型彈道相似,但飛行軌跡為圓形。它們也來源於基礎彈道,在打擊方式上和線型彈道相似,而移動軌跡不同。在做這張表的時候我發現了一些bug,這些bug使得線型彈道無法變成圓形。所以複製這些代碼就相當於也複製了這些bug;複製狂魔永遠的痛啊。讓我們形象的感受一下這種彈道系統吧。大概像這樣總之,lol中的彈道系統十分複雜但是毫無必要,自我糾結而且十分脆弱,改也改不得。既然彈道在這個遊戲中是一個很大的設計區域,那麼我們就必須簡化它,從而使其更容易被改動。最後我們決定把原先的系統推翻重做,這是最簡單粗暴的方法。 一張白紙重做時我們本著4個核心原則:1 相似的功能性應該在寫在同一個代碼里,來確保理解方便2不同功能組之間的依賴性要最少且劃分清楚3彈道基本的形態功能應該要簡單明了4某些特殊彈道要和主要演演演算法直接分離我們的團隊先是確定彈道的核心問題,然後分別對這些問題做出計劃。看得出我很喜歡列清單(上面那張你看不懂的表就是我列的,啦啦啦), 所以我也要陳列一下彈道的工作原理組成:移動:飛彈飛向一個地方碰撞:飛彈打擊目標目標追蹤:飛彈飛向可移動的目標腳本交互:飛彈的行為完全由設計師設計可視性:飛彈的視覺效果視覺特效和聲音:你們都能聽到看到的那些我們就本著上面這些原理進行重做,然後給每個彈道都寫入內容。隨著工作的逐步進行,當概念設計無法滿足需求時,我們開始再次評估然後做出調整。比如,我們把目標追蹤的概念加入到移動的代碼里,因為我們發現這兩者的問題有緊密的聯繫,再比如我們把腳本交互加入到通用的彈道基礎里,因為我們覺得不需要在不同的彈道中進行區分。最後,我們做出了這樣的系統:我們把第一張表稱為「五顏六色噴吐物」,而這張表簡直就是由彩虹構成的。彩虹可是絕佳的建築材料 這對LOL意味著什麼最後我們的工作帶來了兩大好處。第一,彈道代碼再也不會讓我們的程序員感到棘手了,因為發現和解決代碼問題變得輕鬆多了。這為那些原先被視為無法根除的問題,提供了解決的可能性。例如,我們會看到一些視頻里出現飛彈直接飛過目標且未擊中的情況,這讓我們感到很尷尬。雖說這是小概率事件,但這個bug很有可能決定一場遊戲。我們無法重現這個bug,我們也不知道為什麼這種情況會出現,所以我們只能把它暫且放下然後繼續前進。但是,把所有的碰撞都用同一代碼運算,那麼一些會使得碰撞失效的情況就很容易被捕捉。等把那些情況處理完,我們就會很有信心的說每一顆飛彈都會擊中它該擊中的目標。不過還是給自己留條後路,那種飛彈命中失敗的可能性還是存在的。不過我懷疑這可能是由於某些單位位置同步性的錯誤而導致的,並不是彈道碰撞帶來的問題。當然讓程序員輕鬆一點並讓bug少一點,固然是很好,但是第二個更棒的好處在於,我們可以在彈道上更快的做出很新奇的調整。現在我們不用把整個彈道系統都改了才能更變彈道的移動方案,所以我們現在可以輕而易舉的做出很多瘋狂的改動。下面有一些這些所謂瘋狂改動的展示,不過這些都不是真的要上線的:不過是某些程序猿犯蠢的結果罷了。輪子爹轉啊轉我們把德萊文的平砍加了2圈,看上去挺適合德萊文的張揚個性稍微改動一下彈道的飛行軌跡點,維魯斯就在天上畫出愛心咯六邊形是最優多邊形現在有沒有好想射點什麼啊?o/


[圖擷取自網路,如有疑問請私訊]

本篇
不想錯過? 請追蹤FB專頁!    
前一頁 後一頁