各位看官老爺們,這裡是RuaiRuai工作室,一個做單機遊戲的興趣作坊。
前文提到,凡是有“攻擊”語義的物件,在遊戲中,我們給予其一個“CanFight”元件予以表示。CanFight元件提供了底層的攻擊函式,接受一個物件作為攻擊目標,接受攻擊點數和攻擊型別作為攻擊資訊,將攻擊施加在目標身上。但是我們的主角,他可是主角啊喂,總不能只有個光禿禿的攻擊鍵吧,所以我們理所當然地要對這個底層攻擊元件進行各種包裝和擴充套件,使其成為遊戲中能夠被玩家認可的一個“技能”(Ability or spell)。
在這一部分中,不可避免的,我們要從C#指令碼中脫身出來,製作一些簡單的主角技能釋放動畫。也就是——和Unity的動畫機打打交道,筆者對Unity動畫機模型瞭解不深,在接下來的講解中若有偏頗,還請各位不吝賜教!
首先我們先看一下我們的控制框架吧:
前文我們已經分析了移動元件和狀態元件,他們分別負責執行不同需求的移動處理和整個主角的狀態管理控制。在我們的框架中,每當主角接受到一個來自玩家的控制請求後,Player Controller捕獲這個指令,並通知對應的元件進行響應。以技能指令為例,技能控制元件在接受到釋放技能請求時,會先詢問狀態元件當前狀態是否能夠釋放這個技能(在前文中我們也提過,比如我正在釋放技能A,並且不希望被打斷,那麼按下B技能的控制鍵,主角應該不予響應)。如果返回值為true,那麼表明狀態元件已經允許,並將當前狀態切換為釋放A技能的狀態,則在技能控制元件中,需要執行技能A有關的邏輯,並將unity動畫機中的一個引數"技能編號",設定為當前釋放的技能的編號,這樣unity就會播放我們想要的動畫。反之,如果返回值為false,說明當前狀態優先順序高於所請求的動作,那麼這個動作(指令)就不會得到響應。
我們瞭解了控制主角的狀態機模型後,我們便能夠把注意力集中在技能的管理和實現這兩個主要話題上。在我們設計的遊戲中,主角擁有30+個不同的技能,但同時只有4個可以同時生效(即在一段時間內你只能選擇4個可以使用的技能),不同的技能從屬於不同的元素,擁有不同的特性...我們在這裡不對本遊戲的特殊需求做過多的實現上的分析,只是對一般技能-動畫機的實現流程進行闡述,即在上面的流程圖中,我們允許了技能釋放之後,這個技能如何被釋放出來,這個技能以什麼形式儲存在我們的場景中,如果我們對一般技能進行多維度擴充套件,我們如何實現等等。
首先一個技能,對外要開放一個使用該技能的介面,對內要儲存該技能有關的邏輯、過程和資料結構,顯然我們應該把技能這個實體組織成一個類,在每一個類中處理自己技能所負責的邏輯。更簡便的做法是,將每一個技能組織成一個MonoBehavior,並掛載在主角物體上,這樣我們既可以實現對技能資源的動態釋放(disable or enable),也可以方便地管理和擴充套件技能樹。
那麼假定我們已經有了若干個技能元件,並且通過一個技能管理元件獲得了所有父類為技能(Spell)類的子類,那麼當技能管理元件在接受到一個唯一指定技能釋放的請求時,他便直接呼叫對應技能的呼叫函式即可。與此同時,我們還應該啟用動畫機中的相應引數,使得主角做出我們想要的動作來,比如我們可以將Ability狀態下的一個int引數作為技能的唯一標識,當這個標識不為0時,動畫機播放對應技能的動畫。同時,我們還可以在動畫機的某一幀中新增回撥函式,達到在先播放動畫-再判定攻擊-結束播放動畫的效果,最後,應該在動畫機的最後一幀新增回撥函式清空釋放技能的唯一標識,使得技能狀態變數歸位,動畫不再重新播放。
感謝您閱讀到這裡!那麼今天的分享就是這些,歡迎訪問:
整個專案原型github地址:
www.gitHub.com/yunshiyue/elementgame
最後,這裡是RuaiRuai工作室,一個做單機遊戲的興趣作坊,希望你對我們的專案能提出各種意見和想法,也歡迎各種合作!
下期再見!