有限狀態(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)的方法,.

簡單方式使用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í)行的方法:



