跟諸子學(xué)游戲 有限狀態(tài)機FSM

有限狀態(tài)機

?http://wiki.unity3d.com/index.php/Finite_State_Machine? ? ??

是指在不容階段,會呈現(xiàn)不同的功能,這些狀態(tài)是有限的,不重疊的,這樣的系統(tǒng)在某一時刻一定會處于其所有狀態(tài)的其中一個狀態(tài),此時它接收一部分允許的輸入,產(chǎn)生一部分可能的響應(yīng),并且遷移到一部分可能的狀態(tài). 根據(jù)狀態(tài)調(diào)用函數(shù),map保存狀態(tài)(key)和函數(shù)(value) 狀態(tài)可以有子狀態(tài),狀態(tài)里面包含tasks任務(wù).

有限狀態(tài)機包含兩個部分①狀態(tài)集(FSMState),狀態(tài)一般使用枚舉enum或者字符串string,子類繼承狀態(tài)集抽象類(FSMState),然后添加各種狀態(tài). ②狀態(tài)管理機(FSMSystem),管理狀態(tài)集子類的狀態(tài),基本可以稱為:增刪改查取.通過這些組合進(jìn)行一系列復(fù)雜邏輯的操作,達(dá)到邏輯清晰,代碼復(fù)用率高的效果.

5個元素:? ? ①狀態(tài):當(dāng)前處于什么狀態(tài).②事件:當(dāng)前狀態(tài)調(diào)用相同的函數(shù)方法,產(chǎn)出不同的功能.③條件:根據(jù)什么條件轉(zhuǎn)換其他狀態(tài).④動作:條件觸發(fā)狀態(tài),狀態(tài)觸發(fā)動作.⑤遷移:狀態(tài)切換也叫做狀態(tài)遷移,在update里面一直調(diào)用當(dāng)前狀態(tài)對應(yīng)的方法,.

狀態(tài)條件關(guān)系圖

簡單方式使用switch case 來開發(fā),開發(fā)簡單,缺點太多,不做討論;

一般分為3個類 ,例如:

FSMState 狀態(tài)基類,使用枚舉記錄有幾種狀態(tài);使用枚舉記錄狀態(tài)轉(zhuǎn)換的條件;記錄條件所對應(yīng)的狀態(tài)(map),增加/刪除條件所對應(yīng)的狀態(tài);根據(jù)當(dāng)前條件得到狀態(tài);虛方法(可寫可不寫),例如:在進(jìn)入這個狀態(tài)之前做什么動作,在進(jìn)入這個狀態(tài)之后做什么動作;抽象方法(必須寫,因為這些個事件是在邏輯幀update里面進(jìn)行更新的),例如:發(fā)生什么動作/做什么事件,判斷當(dāng)前物體是否要進(jìn)入另一個狀態(tài);

xxxState 狀態(tài)子類,繼承自FSMState ,初始化一些數(shù)據(jù),實現(xiàn)抽象方法等,程序框架搭好之后,主要在這個地方進(jìn)行.

FSMManager:狀態(tài)機管理類,記錄當(dāng)前狀態(tài)ID,記錄當(dāng)前狀態(tài)所對應(yīng)的條件.搭好狀態(tài)對象執(zhí)行的方法,切換狀態(tài)的方法.

實際物體上面去調(diào)用FSMManager中搭好框架的方法.

例如代碼:

實際物體上面執(zhí)行的方法:

掛載到物體上面
FSMManager對象
狀態(tài)基類
狀態(tài)子類
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容