天天看點

有限狀态機FSM詳解(三)

這篇講解如何使用第二篇中寫好的類。

我們使用的是遊戲角色的移動、跳躍、攻擊、待機四個狀态來講,那麼我們要建構出這四個狀态,需要設計的模型是什麼呢?

需要設計一個角色類、一個驅動角色執行個體的運作環境<Unity的MonoBehaviour就行了>。

那我們設計角色類,角色類中持有四個狀态類的執行個體、一個狀态機執行個體。

首先是四個狀态類:

    移動狀态類(繼承State類)

        移動狀态類中持有:

            移動狀态到跳躍的狀态轉換執行個體、移動狀态到攻擊的狀态轉換執行個體、移動狀态到待機的狀态轉換執行個體

            其中移動狀态到跳躍狀态需要考慮設計是否能在移動狀态中跳躍,是否能在移動狀态中實行攻擊,是否能在移動狀态中待機(當然不能在移動狀态中待機了,邊移動邊待機是什麼鬼)。

    跳躍狀态類(繼承State類)

        跳躍狀态類中持有:

            跳躍狀态到其他三個狀态類的轉換執行個體

    攻擊狀态類(繼承State類)

        攻擊狀态類中持有:

            攻擊狀态到其他三個狀态類的轉換執行個體

    待機狀态類(繼承State類)

        待機狀态類中持有:

            待機狀态到其他三個狀态類的轉換執行個體

        然後在每個狀态轉換類中寫判斷條件,一般需要持有外部的判斷對象,是以需要把外部的判斷對象傳入,比如實作這幾個狀态的轉換判斷,我們給角色類設計一個接受外部輸入的屬性<string keyBoard>,那麼我們就要把角色類的執行個體傳入所有狀态轉換執行個體中去,通過判斷角色類的<keyBoard>屬性做出轉換狀态的判斷。

        然後我們要在角色類的初始化中,把這些狀态類、狀态轉換類、狀态機類都初始化完。然後驅動狀态機開始運作。于是整個狀态機就跑起來了。

        但是這樣大家發現一個問題沒有,就是狀态越多,狀态轉換越多,并且是呈 n*(n-1)增長,雖然後面好維護,但是這樣寫的話,也會使狀态轉換類越來越多。我正在思考怎麼減少這些狀态轉換類的數量。歡迎大家提出意見和建議,一起提高。

這篇把使用原理講了,下篇給代碼。

繼續閱讀