前言
轉載請標明出處http://www.cnblogs.com/zblade/
很久沒有更新博客,中間遷移過一次博客,后來一直忙於項目的開發,忙的晚上回去沒時間寫博客,周日又要自我調整一下,所以空閑了很久沒有繼續寫博客。最近終於慢慢放慢節奏,項目也快上線了,可以有空寫一些個人的筆記。准備寫一個戰斗系統的入門筆記,也算一個自我總結和反思的過程,中間有些地方是個人的一些想法和理解,如果有什么不正確的,歡迎大家留言討論。
通常,我們在玩一款游戲的時候,最直接面對的玩法,就是這款游戲的戰斗系統。由於游戲的分類實在太多,對應的戰斗玩法也各有其特色。而我目前參與研發的游戲,主要是RTS游戲和MMORPG游戲兩種類型,所以我的隨筆就記錄一下MMORPG游戲的戰斗系統的一下設計筆記。
2016年屬於MMORPG爆發的一年,多款MMO手游均取得不錯的運營業績,2017,依然屬於主流的手游研發類型。在MMORPG游戲中,目前主流的戰斗系統可以分為2類:回合制戰斗和即時制戰斗。回合制游戲的代表,《夢幻西游》,堪稱經典,網易對於這款端游轉手游的游戲也是用心研發和運營。即時制戰斗的代表,《劍俠》,《齊天大聖》,資料片流出的《劍網三手游》等,都有不錯的即時制戰斗體驗。
雖然很多人對於MMO游戲的理解,主要在系統玩法和社交體驗上,大部分玩家進游戲后的戰斗都是開啟自動掛機的戰斗,相對於MOBA游戲,不注重戰斗體驗。不過剝離出游戲的類型,整個游戲的戰斗系統其實屬於一個相對獨立的模塊,而且是整個游戲的核心部分,所以掌握理解了戰斗系統,對於大部分的游戲可以有一個相對深入的理解。本文就從一個小白的角度去理解隱藏在背后的即時制戰斗系統是如何執行的。
戰斗系統的組成
從小白的角度理解,戰斗系統,可以分為:按鍵響應,技能獲取,尋敵檢測,技能釋放,傷害計算,戰斗表現,總共6個大的部分,下面我逐個分析其中的一些執行邏輯。
一、按鍵響應
在進入游戲后,在游戲的界面上,可以看到一個左側的搖桿,右側都會有一個當前職業的技能控制按鈕。這在MMORPG和MOBA游戲中,屬於比較常見的設計。我們在操作游戲角色進行戰斗的時候,可以點擊右側的技能按鈕,從而釋放技能進行戰斗。從技能按鈕點擊,到執行戰斗,第一步就是按鈕響應。
在玩家進入游戲后,就會在游戲模塊中打開當前角色對應的技能界面,同時對玩家的點擊按鈕添加一個事件監聽。如果你對事件監聽不是很了解,直白的說,就是A添加一個attention,該attention是關注B是否發生,當B發生的時候,B廣播其發生,這時候A接收到B發生了,則執行B發生時A應該執行的一些操作。這樣的一個直白解釋,就是常見的監聽系統的設計過程。這樣當玩家點擊技能按鈕X的時候,技能界面會讀取其對應的技能指代,然后將其廣播出去。在前面監聽的部分,在收到該事件后,就會執行技能獲取操作,從而傳遞到后面的部分。
二、技能獲取
現在執行到第二步,這時候已經知道玩家點擊了某個對應的技能,但是具體是什么技能,還需要進行一系列的操作才能獲取到。首先,游戲中,會有不同的職業,不同的職業會有不同的技能配置。所以首先是需要找到當前職業對應的技能。怎么獲取呢?在MMORPG游戲中,對於不同的職業,會開發對應的技能組件SkillCpnt。在每個職業角色的實例上,掛載一個技能釋放器SkillCaster。這個技能釋放器SkillCaster,就是用來執行技能的讀取和釋放的主要角色。那么它在響應技能按鈕點擊后,會獲取當前玩家具體的技能組件SkillCpnt, 在當前技能組件SkillCpnt中,獲取當前技能對應的技能配置。通常,一個技能按鈕,會對應的配置一個或者多個技能,這時候需要檢測技能的對應釋放順序,同時需要檢測當前技能的CD和消耗等。在獲取到可以釋放的技能后,接下來就需要進行技能的釋放了。技能釋放的第一步,就是尋找攻擊目標。
三、尋敵檢測
在讀取到技能后,接下來就是要找到可以攻擊的目標。首先,會獲取當前技能范圍內的所有目標,然后進行檢測。首先,檢測其是否有效,然后檢測是否屬於當前技能攻擊的類型(比如有的技能打人,有的技能打建築),然后判斷是否是敵人類型(不同玩法對於敵人類型的判斷不一致,需要具體設計),是否在攻擊范圍內,在這個檢測中,通常策划會進行一系列規則擴展,最后得到是一個繁瑣的檢測過程。對於這樣的擴展,程序只能盡量保證擴展性和魯棒性,同時對於某些特定的檢測,盡量寫入特定的玩法,避免影響公共檢測的性能。
在這兒,需要補充一下,對於游戲中的角色,主要分為兩類:玩家和怪物。所以,對於這兩類角色的技能檢測,可以分為兩種不同的方式進行檢測的,這樣可以盡量保證各自的規則設計,避免耦合和繁瑣。
四、技能釋放
相對於前面三步操作,技能釋放的流程就比較簡單,在完成尋敵檢測后,此時已經知道當前主角要用什么技能,對着什么目標進行釋放了,所以通過技能釋放協議,將相關的信息傳遞到服務器,服務器會收到當前釋放技能的請求,然后進行技能校驗,主要是檢驗技能是否處於CD,技能消耗是否足夠,攻擊對象是否有效等檢測,如果通過,則下發給客戶端做技能表現。同乘為了提高用戶體驗,在本地玩家自身的客戶端,其釋放的技能,是先做技能釋放,同時傳遞給服務器技能釋放的請求,如果通過則直接繼續,如果不通過,則打斷播出的技能動作。這樣的設計流程,是為了避免在網絡不好時,技能響應過程太慢,玩家點擊時沒有及時的響應,用戶體驗太差。
五、傷害計算
傷害計算的過程,屬於偏向數學計算的過程,如果從小白的角度理解,其基本的流程可以分為:技能更新,傷害尋敵,傷害計算,傷害結果這4個步驟。首先是技能更新,在打出當前技能后,並不是立即生效的,在配合着動畫和特效,會有一個更新時間間隔,當更新完后,就會進行傷害檢測(通常這個過程稱為子物體更新的過程)。完成子物體的更新后,接着就是傷害計算,首先需要根據規則找到當前子物體周圍配置范圍內的物體,做一次尋敵檢測。這個檢測的過程,其實就是我們常見的技能特效模型檢測,比如直線檢測,圓弧檢測,圓形檢測,矩形檢測,這四種基本最常見的檢測。通過這四種對應的檢測可以獲得一個可以攻擊的目標對象列表,然后逐個計算其對應的傷害。具體的傷害計算,需要根據數值的傷害計算公式,讀取攻擊者和被攻擊者的相關屬性完成對應的傷害值計算。在得到一個傷害結果后,就會進行扣血的操作,然后下發相應的數據結果給客戶端。
六、戰斗表現
最后的戰斗表現,是一個歸納的過程,包括技能釋放角色的戰斗動作和特效,被攻擊者的戰斗動作和特效,已經相應的UI數據展示等。這樣的戰斗表現,都可以用對應的技能控制器來實現,特定的技能控制器,在設置后會進行自更新,然后觸發對應的動作播放,在動作播放中會觸發播放對應的特效。基於這樣的基本設計,就可以實現整個戰斗的動作和特效播放。
寫到這兒,我又要再現我的靈魂畫法了,將整個過程歸納為一個草圖,哈哈:

好了,對於整個戰斗流程,從小白的角度做了一個大概的講解,后續我會接着做一些戰斗系統相關的文章分析,比如尋路,行為樹,AI,組件設計等,下篇文章見~
