1. 程式人生 > >Unity高階——狀態機——有限狀態機

Unity高階——狀態機——有限狀態機

一、狀態機

狀態機能夠分離邏輯程式碼,提高程式碼的可維護性和重用性


本節課我們來學習,在Unity中使用狀態機,來實現一些邏輯的劃分,首先我們需要了解一下,為什麼開發的時候使用狀態機?
之前有過開發經驗的朋友,可能會知道在應用開發中,最常用的一種框架就是MVC框架。
也就是檢視模型控制器這個框架,但是我們在遊戲開發中,會發現很難去應用MVC框架。
是因為我們的遊戲開發,並不像網站或者其他應用開發那樣,模型,檢視和控制器在遊戲開發的過程中,它們的界限很模糊,劃分的不是很清晰。這是因為我們遊戲型別的不同,遊戲本身底層架構就會相差很遠!而且在遊戲中,不同的遊戲物件往往存在大量的互動的這種現象。
所以,這種垂直的MVC框架就不太適用於遊戲開發。但是我依然可以在遊戲開發UI部分使用MVC框架。
除了UI,我們也需要某種程度上去分離遊戲中的一些程式程式碼。比如說我們遊戲中需要些一個指令碼來控制角色的一些邏輯。角色的移動,攻擊等屬性時,我們不可能把程式碼放在一個指令碼中完成,我們肯定要通過一定的方法,把它們劃分成多個指令碼或者說多個部分,依次來實現。因為這樣把複雜的程式碼劃分成一個一個小部分去實現,可以提高我們程式碼的可維護性,以及重用性,這也就是為什麼我們要使用狀態機的原因!

狀態機就可以幫助我們分離邏輯程式碼。

二、有限狀態機
有限狀態機(FSM)簡稱狀態機
FSM的狀態是有限個數的
有限狀態機就是為了表示有限個狀態,以及這些狀態直接的過渡行為的一個模型。在遊戲的開發過程中,有限狀態機能夠將一個複雜的功能或者說複雜的邏輯簡化為若干個穩定的狀態!之後,在這些狀態中進行事件的判斷。

舉一個例子:以人物角色為例

人物角色我們使用狀態機來實現人物的複雜的邏輯的話。我們首先會根據我們的遊戲玩法或者功能,來把遊戲角色劃分為不同個狀態。如遊戲角色處於閒置的狀態,也有可能處於攻擊的狀態,可能處於行走的狀態,可能處於副本的狀態,交接任務的狀態等等……

我們把這些邏輯程式碼都按照狀態來劃分開來之後,我們在單獨在某個狀態中,實現特定的程式碼,如果把這些遊戲角色劃分出有一個是戰鬥狀態,只要戰鬥相關的程式碼我們都會放在戰鬥狀態中去實現。肯定不能放到行走的狀態中去實現的。


這個就是使用狀態機來幫助我們邏輯程式碼進行分離。

舉例:燈泡的狀態圖


燈泡分為兩個狀態:開和關。在任意時刻,燈泡要麼處於開的狀態,要麼處於關的狀態。如果我們當前燈泡是開著的,如果我們想把燈泡關閉,我們只需要關閉開關就可以了。反過來,如果我們當前燈泡是關著的,我們想要開啟燈泡,只需要開啟開關即可。

在這個燈泡的狀態圖中我們可以分類出兩個狀態,這裡面的狀態(State)就是為了儲存燈泡的一些資訊的或者執行某些動作。

如果我們從開的狀態切換大關的狀態這中間就叫狀態過渡(Transition)

狀態過渡就是用來描述:狀態直接的轉換的。
我們關閉開關和開啟開關之間就是狀態過渡的條件,它們的作用就是用來觸發一個狀態過渡的,我們稱為過渡事件(Event)!


我們在開或者關的狀態中,還會有一個動作,這個動作可能是持續執行的或者一瞬間執行的,稱為動作(Action)!

圖片中所有元素組合到一起,就是一個狀態機!
三、回到Unity中進行演示——把燈泡這個功能Unity中實現一下
首先為了專案準備了一些材質球,然後我們就開始

在場景中建立一個Plane——然後我們把Plane染成綠色,然後在建立中,建立一個Cube,給Cube染一個紫色,然後我們調整攝像機,對準Cube……未完待續……