目標
1. 一個實現了基礎角色控制的版本,包括角色的移動、潛行、跳躍,翻滾等功能。
2. 定義角色相關的API接口給其他模塊使用。比如當前角色的狀態,狀態切換的回調等。
3. 定義角色相關屬性配置的SO,讓策劃可以編輯一些遊戲中不會改變的角色的屬性。
實現
效果
用了大概一天的時間基於nodeCanvas插件的FSM完成了一個角色控制框架的搭建,並向其他模塊提供API接口。具體效果如下:

由於是第一版,本著快速交付的原則,只實現了一些基礎的動作,動作也會比較糙,手感也會比較生硬,後續會繼續完善。
角色控制的FSM
由於組裡小夥伴提供了正版的nodeCanvas插件,其中有FSM的模塊,所以作者就直接使用它來實現角色控制。硬說理由的話單純是想學習使用下這個插件,之前一直是用自己實現的一個簡單狀態機,也想看下商業插件是如何實現的。
由於本身的FSM框架NodeCanvas已經搭好了,所以作者只需要按照框架來派生兩種類,
1. 角色狀態類:繼承至NodeCanvas的FSMState類,實現角色的各種狀態,比如移動、潛行、跳躍、翻滾等。
具體的代碼結構如下:

狀態類主要重載:
- OnInit: 初始化狀態時調用
- OnEnter: 進入狀態時調用
- OnUpdate: 更新狀態時調用,更新頻率是每幀。好像沒提供fixupdate,需要的話可能要自己找個地方實現一個。
- OnExit:退出狀態時調用
2. 切換條件類:繼承至NodeCanvas的ConditionTask類,實現角色狀態切換的條件,比如按下某個按鍵,檢測碰到地面等。
具體的代碼結構如下:

條件類主要重載:
- OnCheck: 檢查條件是否滿足時調用
- info: 顯示在連接線上的提示信息,用來描述這個條件的作用。
在這兩個類裡想要有序列化的字段的話,跟mono腳本一樣寫就行,它會自動顯示在State的Inspector面板上。如果要字段能引用Blackboard上的數據(就是這個圖的全局變量),就需要用BBParameter<T>這個泛型類來聲明。
CharacterAPI類
剛才我們在定義角色狀態類和切換條件基類的時候,都往裡面加個一個CharacterAPI類。這個類的作用有兩個:
1. 提供角色狀態類和切換條件類的一些公共屬性和方法,還有就是一些掛載在角色身上的組件,比如動畫組件、角色控制器組件等,這樣就不必每個狀態類/條件類初始化時都再去GetComponent一遍。
2. 提供一些角色控制的API接口給其他模塊使用,比如角色的狀態切換回調,角色狀態值,血量什麼的。
具體的代碼結構如下:

角色基礎屬性配置
比如一些基礎的跳躍高度,跑步速度現在是分散到各個狀態類裡,這樣不太方便策劃編輯,所以為了讓策劃可以方便修改,作者設計了一個角色基礎屬性配置SO,讓策劃可以在統一的地方編輯一些遊戲中不會改變的角色的屬性。 具體代碼就是一個簡單的SO的單例。
