##一:需求 RPG遊戲中 角色,怪物的狀態種類比較多, 所以須要對基本狀態進行抽象,經過子類繼承的方式來構建一個易於擴充的框架。
總體需求便是:
1:可以方便的構建新的AI
2:可以方便的增長 角色狀態 3:狀態代碼之間 邏輯獨立,修改不會產生反作用安全
##二設計 核心思想是構建一個基本的狀態機,經過在每一個狀態中填充不一樣的邏輯代碼,來構建不一樣的AI行爲表現,同時經過組合不一樣的狀態構建不一樣的狀態機結構。框架
![在此輸入圖片描述][1] [1]: http://static.oschina.net/uploads/space/2015/0227/132157_jV0j_186074.pngspa
首先肯定有多少種大的AI狀態,繼承AIState 產生基本狀態子類.net
![在此輸入圖片描述][2] [2]: http://static.oschina.net/uploads/space/2015/0227/132710_XN5A_186074.png設計
繼承這些基礎子狀態,構建實際的AI狀態code
![在此輸入圖片描述][3] [3]: http://static.oschina.net/uploads/space/2015/0227/132947_KmCa_186074.png協程
##三接口設計和 進一步擴展性 接口設計: AICharacter是一個狀態機,狀態機的基本接口包括: AddState 初始化狀態機結構,向狀態機中添加狀態邏輯; ChangeState 切換狀態機狀態;繼承
AIState: 每一個狀態基本接口包括: EnterState 進入狀態初始化 ExitState 退出狀態 清理 RunLogic 狀態邏輯 更新 CheckEvent 檢測外部事件接口
個人AIState實現是主動檢測外部事件類型的,也就是在狀態循環中 不斷檢測是否有外部事件,若是有則進行事件處理;
還有一種AIState實現是 被動接受事件,當有事件發生,當即執行AIState中對特定事件的處理代碼,這種方式的缺點是可靠的清理AIState的內部狀態比較困難一些,第一種方式,RunLogic能夠實現爲Coroutine 協程, 這樣代碼邏輯清晰,只須要在代碼邏輯中安全位置 插入 CheckEvent 調用便可 方便的清理狀態。遊戲
潛在擴展性: 1:上面的設計分離了AI狀態和實際的代碼邏輯實現,當前的實現有兩個缺點:
一個限制是 AI狀態機同一時刻只能處於一種狀態,如何擴充支持多層次獨立狀態,暫時沒有考慮; 二是相似行爲樹這種機制屬於AI決策部分,這部分如何和狀態機進行結合沒有考慮過,如今的實現是經過替換AIState實現來定製不一樣的AI。 2: 如何腳本化,要將AI邏輯實現作成腳本,只須要繼承基本狀態,構建一個特殊的具體AI狀態,該AI狀態添加一個AI腳本的配置,執行該AI狀態時,去執行腳本邏輯代碼,便可實現AI的腳本化。
樣例代碼正在上傳,傳好以後分享在這裏:(待續)