遊戲AI之初步介紹(0)

遊戲AI是什麼?


遊戲AI和理論AI

可是值得注意的是,可是遊戲AI與理論研究的AI那些有所不一樣。
咱們平時所熟悉的人工智能,大多數是指理論AI。(例如深度學習,機器學習)程序員

而遊戲AI每每不多應用到理論AI那些神經網絡、深度學習等等理論AI所流行的技術。算法

智能的假象

遊戲AI主要是程序員預先定義編寫好可能發生的行爲,而不具備理論人工智能那種自我「學習」的特性。數據庫

由於遊戲AI主要職責是模擬出智能行爲,而並不是學習
(例如:街道上會避讓車的人羣,天空中亂飛的小鳥,來回巡邏的守衛,兵線上的小兵...)編程

能夠說遊戲AI是智能的假象。設計模式

要是遊戲功能須要自我學習,儘量作出最優策略,更應該使用理論AI(也是咱們熟悉的那我的工智能),經過神經網絡,深度學習等流行技術實現。
例如:圍棋AI阿法狗,DOTA2的OPENAI服務器

(更新)遊戲AI和機器學習

之前以爲機器學習要應用於遊戲AI,還遠得很。
最近看到一些資料後,也嘗試玩了玩Unity機器學習,才發覺機器學習佔領遊戲AI的可能性和趨勢。
這讓我對遊戲AI和理論AI的見解有了變化,所以下面介紹也會提到機器學習。網絡

所以如今看來,理論AI能夠概括爲遊戲AI的一部分。遊戲AI應該分爲人工製做的和機器學習訓練的。數據結構

介紹一些遊戲AI


4X遊戲AI

《羣星》《文明》《王國風雲》等爲表明的4X遊戲,戰略遊戲的一種,其主要的四個遊戲目的分別是:
eXplore(探索),eXpand(擴張),eXploit(掠奪),eXterminate(毀滅)。機器學習

爲了讓玩家在4X進程中受到阻擋,4X遊戲AI必須得足夠聰明作出決策,
但又同時爲了避免讓玩家以爲沒法勝利,它每每不是採用最優策略,而是使用更「人性化」的策略,
(例如反應延遲,走的路徑稍微扭曲,模糊決策等作法)。

《求生之路》系列

做爲一款FPS遊戲,很難說《求生之路》裏的怪物有多智能——它們原本就該是愚蠢而兇猛的。真正有技術含量的是它的「導演系統」,AI Director做爲後臺的核心,會根據玩家在遊戲中的具體表現調控遊戲的節奏。怪物出現的地點、數量,何處刷新道具等等,配合上根據形勢動態變換的音樂,給了用戶更真實的遊戲體驗。

角色扮演/沙盒遊戲中的NPC

在一些自由度較高的遊戲中,爲了讓玩家更好的融入這個世界,遊戲會對NPC進行不少詳細的設定。好比在《巫師》系列中,每一個NPC都有本身的性格設定,包括會話數據庫,讓他們能夠進行豐富的動做和對話。在GTA這種沙盒遊戲中更是這樣。

遊戲AI 基本設計


智能體(Agent)

首先咱們得理解一個術語:智能體(Agent)。通俗點意思是一個被AI操控的對象物體。

若是一個智能體擁有自治動做(即本身遇到狀況就作出本身的行爲反應),那麼則稱其爲:自治智能體。

在《看門狗》《GTA》裏,街上走路的人或者開動的汽車,就是一個自治智能體。主角開車若是衝向它們,這些自治智能體可以自行判斷並作出躲開的動做。

而後在現實世界裏,咱們能夠這樣直觀的理解智能:
一個正常的智能體,得先感知到周圍的事物,才能思考下一步該作什麼,才能作出反應行爲。

基於這個直觀理解的模型,咱們便天然而然分出如下三個模塊(事實上也是經常使用的AI設計方式):

  • 感知模塊
  • 決策模塊
  • 行爲模塊

感知(Perception)

通常的遊戲AI,智能體所能獲取的信息應該老是有限的。
引入「感知」的概念,用以模擬智能體的感官,從而讓智能體能獲取必定程度的信息,用於以後的決策判斷。

例如:

  • 一個NPC的視野範圍內看到了有一個喪屍。
  • 一個喪屍聽到了玩家的腳步聲。
  • 足球隊隊員之間的傳達配合信息。
class AgentPerception {
public:
    //進行一次感知探測
    void check();
    //訪問感知目標結果
    Information& getCheckResult()const;
private:
    //...
};

可參考:遊戲AI之感知(1) - KillerAery - 博客園

決策(Decision)

決策模塊通常經過分析感知信息,進行計算,輸出接下來想要作的行爲的結果。

例如:

  • NPC決策模塊檢查了這個喪屍,判斷到它是本身的敵人,因此輸出了逃跑的決策。
  • 喪屍決策模塊檢查了這個玩家,判斷到它是本身的敵人,因此輸出了撲過去攻擊的決策。
  • 中鋒決策模塊檢查了前鋒的帶球狀況,判斷到它想傳球,因此輸出了要去對應的位置接球的決策。

能夠把決策模塊想象成一個大腦(爲了類比,能夠把下面的「決策模塊」字樣當作「大腦」):
決策模塊可以獲取智能體模型的感知信息,分析之,並返回行動決策。

class AgentBrain{
  public:
    //計算得出智能體的決策
    Decision caculate(Agent* agent){
      //獲取感知信息
      Information& information = agent->mPerception.getResult();
      
      //根據感知信息,讓寄主執行行爲
      if(information...){
        return Decision(MoveTo, ...);//移動到...的決策
      }
      if(information...){
        return Decision(Attack);//攻擊決策
      }
      //....
    }
  private:
    //...
  };

行爲(Behavior)

通常的遊戲模型應該提供相應的行爲接口,而後行爲模塊負責處理決策,執行對應的行爲。

//一個智能體類例子
class Agent{
public:
  //智能體的各類行爲接口
  //...
  void moveTo(cosnt Vector3& pos);
  void attack();
protected:
  //智能體的各類變量
  //....
  Vector3 mPosition;              //當前位置
  int mAttack;                    //攻擊力
  ViewPerception mPerception;     //視野感知模塊
};
class AgentAction{
public:
  //處理決策,讓智能體執行對應行爲
  void doAction(Agent* agent,const Decision& decision);
};

遊戲AI 須要學些什麼?


由於遊戲AI需求多端,博主在查閱多方資料和平時實現時知道的全部可用的基礎知識/解決方案/雜項技巧列舉出來,固然對於重要的基礎知識會mark出來。

有限狀態機(FSM)

[重要]
「狀態機」是一種表示狀態並控制狀態切換的設計模式,經常用於設計某種東西的多個狀態。
例如一我的有站立狀態,跑動狀態,走路狀態,蹲下狀態,開火狀態等...
當應用在遊戲AI時,它也能夠做爲AI的決策結構(之前老遊戲的AI決策結構幾乎都是採用狀態機)。

可參考:遊戲設計模式——有限狀態機 - KillerAery - 博客園

行爲樹(Behavior Tree)

[重要]
「行爲樹」是一種以樹狀結構表達的決策模式,也是一種設計模式。這也是現代遊戲AI最經常使用的決策結構。

可參考:遊戲AI之決策結構—行爲樹(2) - KillerAery - 博客園

尋路(Path Finding)

[重要]
「尋路」是遊戲裏極爲常見的操做,經常使用的算法有A* 算法,固然更優化的話則是依賴規劃網格的尋路。
路徑規劃(Path Planning) 則是輔助改進尋路的,例如提早構建路線,劃分區域等,以便遊戲進行後利用預先處理好的數據進行高效的算法操做。

可參考:A*尋路算法 - KillerAery - 博客園
遊戲AI之路徑規劃(3) - KillerAery - 博客園

腳本驅動(Script Driving)

使用腳本能夠隨意編寫出邏輯代碼而無需再次編譯,從而極大減小修改邏輯的成本。
遊戲AI的邏輯修改每每很頻繁,使用腳本編寫AI邏輯無疑是必要的。
此外遊戲程序最經常使用的腳本語言——Lua.

可參考:C++與Lua交互之配置&交互原理&示例 - KillerAery - 博客園

機器學習(Machine Learning)

[有潛力]
機器學習訓練出遊戲AI的優點在於:

  • 機器學習訓練出的遊戲AI,模型可能數據龐大,可是這徹底能夠部署於服務器。
  • 目前絕大部分遊戲AI都是人工製做,工做量龐大。機器學習能夠解放生產力,放臺主機訓練讓其本身培養出更實的AI。

但缺點也是有的:

  • 過於複雜的環境,或者須要複雜交互的AI幾乎很難訓練出來(例如開放世界RPG遊戲的NPC,它們都得有本身的一套複雜劇本臺詞和NPC行爲)

所以目前看來,機器學習訓練出來的AI可用於簡單交互的AI,例如看到人就跑的小動物,更復雜的是會遵照交通規則的路人/車輛。

若對Unity的機器學習插件感興趣:Unity 用ml-agents機器學習造個遊戲AI吧(1)(Windows環境配置) - KillerAery - 博客園
Unity 用ml-agents機器學習造個遊戲AI吧(2)(入門DEMO) - KillerAery - 博客園

羣體智能(Group AI)

"智能"表示一個AI,而「羣體智能」則表示集羣的AI。例如足球遊戲裏,集羣AI操控一方全部球員互相配合傳球踢球。又或者射擊遊戲裏,集羣AI操控一支小隊經過戰術進攻據點。
若是對於一個智能體集羣狀況,使用大量的自治智能體(一個AI控制一個智能體)很容易出現CPU性能瓶頸:由於這些自治智能體互相不可知,須要通過複雜的獲取信息階段,複雜的決策階段纔可作出團隊行爲。
而集羣AI,則能夠當作一個AI控制多個智能體,這樣集羣的信息數據甚至是行爲均可以共享,也方便集羣AI統一調配管理控制下屬各個智能體。

羣體智能的一個GDC演講:GDC2012講座:《殺手:赦免》中的人羣系統

模糊邏輯(Fuzzy Logic)

爲了讓遊戲AI更人性化,模糊邏輯頗有必要。作遊戲AI每每不是作最優解,而是作像人類的解。
在某些時候,例如:某個AI戰鬥結束後,判斷若是子彈數量少,則回基地取彈藥,
「子彈數量少」這個條件就能夠作成一種模糊邏輯條件。

可參考:遊戲AI之模糊邏輯(4) - KillerAery - 博客園

模糊邏輯的一個擴展是 模糊狀態機(FuSM)
傳統狀態機每每是個肯定的狀態,例如要麼是On狀態要麼是Off狀態。可是經過結合模糊邏輯和狀態機,即可以有稍微On的狀態、不太Off的狀態等更多的選擇性,這能夠給AI設計師添加更多模糊狀態對應的行爲,這給遊戲添加了更多樂趣:很是懼怕時拋下武器逃跑,懼怕時帶着武器逃跑,有點懼怕時且戰且退...

勢力圖(Influence Map)

勢力圖是將遊戲地圖劃分網格,每一個網格都有一個勢力值(實際上也能夠有其餘數據),該值受周圍元素影響。例如足球遊戲裏,每一個球員AI有一張勢力圖,球和隊友會對周圍網格形成正值影響,而對手和邊界會對周圍網格形成負值影響...這樣將全部影響元素考慮以後,球員AI會偏向將球踢向/傳向勢力值最大的網格。

黑板(Black Board)

「黑板」簡單來講就是多模塊間數據共享的數據結構。編寫遊戲AI引擎時,每每避免不了各模塊之間的通訊,而使用黑板模式無疑是極好的選擇

可參考:遊戲設計模式——黑板模式 - KillerAery - 博客園

協程(Coroutine)

協程(也叫微線程),它會在每一個時間間隙更新執行一些代碼,效果看起來就好像另外一個線程在執行同樣(但實際是同一個線程)。
遊戲AI有大量的關於時間的動做(例如延時2秒執行某某操做),使用協程能夠大幅簡化一堆Update的計時代碼。

Unity協程筆記:Unity C#筆記 協程 - KillerAery - 博客園

雜項技巧(Trick)

經過「抖動」(Dithering),"平滑"等技巧能夠加強擬人性,讓AI愚笨的像我的。
簡單的解釋抖動的話,就是說先計算一個最優解(不可打敗的AI),而後給這個最優解作一些隨機數的修正,從而偏離最優解(有點難但可打敗的AI)。

資源分配樹(Resource Alloction Tree)是一種樹狀結構,用於表示一個玩家的全部資產類型及其權重。決策時可根據資源分配樹各個節點權重來執行不一樣的分配策略。例如在《文明5》裏,各個AI文明有些偏重和平發展政策,有些偏重軍事征服政策,有些偏重文化政策...經過不一樣的資源分配樹能夠製做特徵各不一樣的AI。

依存圖(Dependency Graph)則是一種有向圖結構,用於表示不一樣資產類型的依存性。例如玩家進入中世紀時代才能夠建造射箭場,建造了射箭場才能夠生產弓兵,所以能夠構造出這樣一個依存圖:中世紀時代->射箭場->弓兵。依存圖經常被AI用來規劃當前的發展路線,也能夠用於推理對方玩家的科技樹,從而調整發展策略(例如調整資源分配樹權重)。舉個例子:例如發現敵方玩家的一個弓兵,那麼容易推斷敵方玩家已經建造出了射箭場,那麼在軍事分配上就會偏向發展騎兵,而不是發展步兵(被弓兵剋制)。

參考


  • [1] 《遊戲人工智能編程案例精粹(Programming Game AI by Example)》 Mat Buckland [2012-9]
  • [2] Finney的博客——AI分享站 http://www.aisharing.com/
  • [3] 《遊戲編程精粹2(Game Programming Gems 2)》 Mark DeLoura [2001-10]
  • [4] 《遊戲編程精粹3(Game Programming Gems 3)》 Dante Treglia [2002-7]

遊戲AI 系列文章:遊戲AI - 隨筆分類 - KillerAery - 博客園

相關文章
相關標籤/搜索