遊戲開發——遊戲AI的簡述

一.遊戲AI

遊戲AI(Game AI),是指在遊戲中,由已經寫定好的程序控制的“類人化玩家”,俗稱電腦玩家。一般的遊戲AI能夠擁有對真實玩家的一系列操作感知的能力並對此作出交互行爲,比如:攻擊(Attack),逃跑(Run away)等。而且AI所做出的反應並不是憑空生成,而是通過模仿真實玩家的操作使其行爲富有“智能化(Intelligent)”。

需要注意的是,一般的遊戲AI與我們討論計算機視覺、自然語言處理等領域時所說的AI(人工智能)並不相同,考慮到遊戲的開發成本,週期以及家用計算機處理能力,遊戲AI的智能度相對較低。不過隨着硬件的發展,遊戲AI始終會朝着真正AI的方向發展。

遊戲AI中通常分爲定性非定性兩種。

  • 定性:定性即AI的行爲是人爲設計好的,只有true(做出反應)或false(不做出反應)。比如說怪物AI,感知到玩家進入視野範圍,就會往玩家此時的方位移動,AI不會思考玩家是否攜帶武器,是否處於某種狀態之類的情況。
  • 非定性:非定性即AI的行爲有一部分是不可預測的,具體實例是讓AI角色學習到適應玩家的行爲。這樣的學習能力可以利用人工智能的神經網絡、貝葉斯技術或遺傳算法得到。該技術可以讓 AI 自主進行學習,並進化出新的行爲,增加遊戲可玩性。開發者也無需考慮到AI在遊戲中所出現的所有情況,可以減少定性AI所產生的一些BUG。目前已經有一些3A開發廠商開始對這一方面進行深入研究。

目前遊戲AI基本歸結爲三個部分的能力:感知,思考,動作。

  1. 感知:是指能夠察覺到周圍環境變化,如玩家進入視野,AI受到攻擊等。
  2. 思考:是指能夠對感知到的事物進行一個選擇反饋,“思考”該做出什麼行爲,這是AI中最主要的組成部分。
  3. 動作:是指AI通過思考得出結果並根據該結果在遊戲做出實際的行爲,攻擊,逃跑,交流等都屬於這一類。

二.遊戲AI的基本實現方式

Ⅰ.樸素AI

樸素AI指的是僅僅使用簡單的分支語句(if…else或switch…case)對AI的行爲進行判別和分類。

舉個栗子,一個敵方士兵在基地站崗,擁有以下幾個基本行爲:

  • 玩家未靠近時自動巡邏
  • 玩家靠近基地時(5m)向玩家移動
  • 碰見玩家(<2m)就進行攻擊
  • 血量低於30%時尋找掩體並躲起來
  • 血量爲0時死亡

IF…ELSE實現:

if(AI.HP == 0){
   AI.Dead(); 
}else if(AI.HP > 0 && AI.HP <= 0.2){
   AI.FindBunker();
}else if(AI.Distance - Player.Distance <= 2){
   AI.Attack();
}else if(AI.Distance - Player.Distance <= 5){
   AI.MoveToPlayer()
}else{
   AI.Patrol();
}

由於遊戲中有多種AI,每種AI的行爲方式不盡相同,用這種方法我們需要爲每一種AI單獨寫一份代碼,幾乎沒有可重用性,會使開發人員的工作量增大。但是因爲樸素AI的效率高,代碼直觀,所以一般用在項目初期的測試以及應急時期。

Ⅱ.AI有限狀態機 (Finite-state machine,FSM)

有限狀態機是一種抽象機制,通常設定了各種不同的預定狀態。有限狀態機也可以定義一連串的條件,以便確認何時應該改變狀態,當一個事件的發生,將會觸發一個動作,或者執行一次狀態的遷移。FSM中一定存在兩種狀態–初始狀態結束狀態,在啓動一個FSM時,首先必須將FSM置於“起始狀態”,然後通過輸入一系列操作,最終,FSM會到達“結束狀態”或者“消亡狀態”。

任何一個FSM都可以用狀態轉換圖來描述。這裏我仍然拿上一個栗子來說,下面是一個實際栗子的狀態轉換圖:

在這裏插入圖片描述
簡單的FSM代碼:

private Enemy enemy = new Enemy();
public void EnemyAction()
{
    if(enemy.HP){
       status = AI.Dead(); 
	}else if(enemy.HPLower){
	   status = AI.FindBunker();
	}else if(enemy.CloseToPlayer){
	   status = AI.Attack();
	}else if(!enemy.CloseToPlayer && enemy.DistanceToPlayer){
	   status = AI.MoveToPlayer()
	}else{
	   status = AI.Patrol();
	}
} 

FSM相比於樸素AI的優點:

  • 可以通過分類封裝接口,讓每一種AI調用接口來實現狀態的遷移
  • 不需要實時計算各類函數,減少計算產生的損耗

但是也有缺點:

  • AI越智能,狀態流程圖就越複雜,後期難以維護
  • AI的功能難以擴展,新加狀態的時候需要考慮目前狀態間的關係
Ⅲ.AI行爲樹 (Behavior Tree,BT)

Behavior Tree是一種樹狀的數據結構。每次調用都會從根節點開始遍歷,自頂向下,通過一些條件來檢索這顆樹,最終確定需要做的行爲並執行。下面是一個簡單的行爲樹:
在這裏插入圖片描述
在遊戲中,行爲樹的父節點統稱控制節點,而子節點則稱行爲節點

  • 控制節點:當AI接收到來自遊戲中的某一條件時,就會開始遍歷這顆行爲樹,例如:Attack的時候就會從根節點遍歷到Attack這個節點上去,並且執行該節點下的行爲。這時候的控制節點的作用就是接收信息並對信息進行決策篩選,它沒有執行具體操作的功能
  • 行爲節點:行爲節點處於樹的最底端,是最後一個接受信息的地方,意味着它需要對控制節點篩選出來的信息進行具體的操作反饋,是執行具體狀態行爲的地方

事實上,行爲樹又稱決策樹,因爲整棵樹最主要的部分是控制節點,它需要對條件進行決策,判斷出需要執行的正確的行爲

行爲樹的優點不僅在於它邏輯清晰,而且我們可以對其控制節點自定義判斷。一般簡單的自定義控制節點有三種:

  1. 選擇(Selector):根據條件信息,只選擇其子節點的某一個執行。
  2. 序列(Sequence):根據條件信息,將其所有子節點依次執行一遍,只有當前一個子節點返回“完成”狀態後,才能繼續運行下一個子節點。
  3. 並行(Parallel):根據條件信息,將其所有子節點都運行一遍。

不過單獨使用行爲樹也是有缺點:

  • 行爲樹後期分支數量龐大,每次遍歷尋找合適節點的過程消耗高。
  • 如果需要序列或並行狀態,需要對整棵樹進行多次遍歷,過程繁瑣。
Ⅳ.個人總結

無論是什麼遊戲,遊戲AI所使用的最好的方法從來不是一個,而是通過不同類型AI來尋找適合該時期使用的方法:狀態機+行爲樹,樸素AI+狀態機+行爲樹等等。隨着遊戲的不斷髮展,遊戲AI也還有很大的成長空間,會有更多的算法和優化方法去構造更加智能的遊戲AI。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章