天天看點

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

本節書摘來自華章出版社《unity 3d人工智能程式設計》一 書中的第2章,第2.5節,作者:(美)基奧(kyaw,a.s.),(美)彼得斯(peters,c.),(美)斯瑞(swe,t.n.),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

現在來看一下敵方坦克的人工智能的代碼。把我們的類稱為simplefsm,這個類繼承自我們的有限狀态機抽象類。

simplefsm.cs 檔案中的代碼如下所示:

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

在這裡我們聲明了幾個新的變量。敵方坦克的人工智能将會有4個不同的狀态:巡邏、追逐、攻擊和死亡。大體上,我們将實作的有限狀态機是第1章中所描述的例子。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

敵方坦克人工智能的有限狀态機

在初始化方法中,我們建立了敵方人工智能坦克的屬性預設值。然後,我們在局部變量中存儲了航點的位置。我們通過findgameobjectswithtag方法,試着找到這些具有wandarpoint标簽的對象,最終得到場景中的這些航點。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能
《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

在每一幀中都會被調用的update方法如下所示:

我們檢查目前狀态,然後調用相應的狀态方法。一旦發現對象的生命值為0或小于0時,我們就會把坦克狀态設為死亡。

當我們的坦克在巡邏狀态時,我們會檢查它是否已達到目标點。如果是,它就會尋找下一個要跟随的目标點。findnextpoint方法主要是從所定義的航點中選擇下一個随機目标點。如果它在向目前目标點前進的路上,它會檢查與玩家坦克的距離。如果與玩家坦克的距離在一定範圍内(在這裡是300),它就會更改為追逐狀态。代碼的其餘部分隻實作旋轉和向前移動坦克。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能
《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能
《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

同樣,當坦克處于追逐狀态時,它會檢查自己與玩家坦克的距離。如果距離足夠近,那麼它就會切換到攻擊狀态。如果玩家坦克已經跑得太遠了,那麼它就會切回巡邏狀态。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

如果玩家坦克足夠接近攻擊敵方人工智能坦克,那麼敵方坦克就會向玩家坦克旋轉炮塔,然後開始射擊。如果玩家坦克超出範圍,那麼它會切回巡邏狀态。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能
《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

如果坦克到達死亡狀态,那麼我們将會讓它爆炸。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

這是一個很小但卻能夠給出一個漂亮爆炸效果的函數。我們隻需應用一個explosionforce到我們的剛體元件,并增加一些随機的方向即可,其代碼如下:

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

進行傷害

如果我們的坦克被一顆子彈擊中,它的生命值屬性将會基于子彈對象的傷害值相應地減少。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

在unity中打開simplefsm.scene,就可以看到人工智能坦克巡邏、追逐和進攻玩家。我們的玩家坦克不會受到人工智能坦克的傷害,是以它永遠不會被摧毀。但是人工智能坦克有生命值,并承擔由玩家的子彈造成的損害。是以,一旦它們的生命值屬性值變成零,你就會看到它們爆炸。

《Unity 3D人工智能程式設計》——2.5 敵方坦克的人工智能

繼續閱讀