【總結】游戲AI人工智能


參考書籍《Unity3D人工智能編程精粹》《Unity3D人工智能編程》
 
游戲AI的架構模型
 
  • 運動層:AI的具體行為,比如移動
  • 決策層:決定AI下一時間步該做什么
  • 戰略層:從集體層面對個體AI進行控制
 
除此之外,還要結合動畫系統,物理引擎,感知系統等,共同組成人工智能
 
個體AI
 

 

  1. Seek 是最常見的AI行為,最簡單的實現是給AI添加一個修正力使之向目標移動
  2. Flee 和Seek相反,通常我們都要設置一個Distance范圍判斷結束行為。用Vector3.sqrMagnitude向量平方長度,計算會更快
  3. Arrival 到達目標減速至停止,可設置一個StopDistance,距離大於停止距離時給一個Force移向目標
  4. Pursuit 追逐會預測Target的未來位置,比如預測t時間內Target不會轉向,AI將計算未來位置朝之移動。另外還可以用點乘計算夾角,判斷雙方是不是面對面
  5. Evade 逃避。與Pursuit反向
  6. Wander 隨機徘徊。設置一個圓周半徑,每幀給Target附加隨機位移,比AI只按照預設好的路線移動更加真實
  7. FollowPath 路徑跟隨。設置radius路點半經,讓AI在路徑間切換更加真實
  8. CollisionAvoidance 避開障礙。向前射線檢測障礙物的包圍圈,產生一個排斥力。
 
集體AI
 
組行為
  1. 分離:避免局部擁擠
  2. 隊列:朝向附近同伴的平均朝向
  3. 聚集:向附近同伴的平均位置移動
 
Radar 檢測附近的AI角色(數學/Trigger)
Separation 分離。 搜索領域內的其他鄰居,計算兩者間的向量並單位化,得到排斥力方向,排斥力大小與距離成反比
Alignment 隊列。將AI的朝向糾正為和鄰居一致,平均朝向減去當前朝向就是操控朝向
Cohesion 聚集。
 
集體AI往往需要一個集體狀態機, 負責判斷團隊整體狀態和動作
各個角色則需要完成動作的多層狀態機設置,比如這層行動路線,下層具體行為,下層角度速度細節
AI Director導演系統控制整局游戲流程
更多實例暫略……
 
A*尋路
 
A* (A-Star)算法是一種靜態路網中 求解最短路最有效的直接搜索方法,也是許多其他問題的常用啟發式算法。注意——是最有效的直接搜索算法,之后涌現了很多預處理算法(如ALT,CH,HL等等),在線查詢效率是A*算法的數千甚至上萬倍。
 
歐幾里得/歐拉距離: 多維空間兩點間的距離,即直線距離
曼哈頓距離:估計到目標格子之間的水平和垂直方格的數量和,即不走斜路
 
地圖,目標估計,代價,節點
 
導航圖:將地圖用圖表示
1、基於單元的導航圖
     將地圖划分為多邊形單元組成的規則網格。易於動態更新,但時間空間消耗都大
 
2、創建可見點導航圖
     先手工放置一些路徑點,然后若路徑點之間可視,就能以邊連接。可以設置一些特殊點,適合簡單的尋路
 
3、創建導航網格NavMesh
     將可行走區域划分為凸多邊形。可以是多種多邊形的組合,讓網格划分更加合理
     采用“視線確定”方法,向前跳到視線最遠途經點,對路徑進行后處理,得到更平滑的路徑
     效率高,空間小
 
以基於單元的導航圖為例,執行A*算法
 
g(n):起始節點到當前節點n的代價
h(n):當前節點n到目標節點的估計代價
f(n)=g(n)+h(n)  從初始狀態經由狀態n到目標狀態的代價估計
 
open表:待考察的結點的優先級隊列,代價從低到高(可以不排序,只找最小值)
closed表:已考查的結點列表
 
第一步:取起始結點,將其8個鄰接點加入Open,並將各鄰接點的父節點設置為起始節點,起始點加入Close
 
第二步:計算open表中結點的代價f=g+h,計算規則是:
g:取父節點g值,根據n點和父節點的連接方式計算。如果是直角連接g++,對角連接g+=1.414
h:采用歐幾里得距離/ 曼哈頓距離[不考慮障礙物]
根據f大小來確定open表中下一個要被檢查的節點
 
第三步:取f最小結點,檢查8個鄰接點,障礙物點無視。
計算各鄰接點通過當前結點得到的新g值,計算規則同上
     新結點加入open表
     已經在open表的,若新g值比原值大,不需更新。若小於原值,則更新g,f,父節點,而不用更新h
     已經在closed表的,按上圖文字處理
 
第四步:對於具有相等的最小代價值f的結點,可任選一個計算。
……
循環直到終點
 
其他
1.對於已經計算的(存在於open或closed表中)節點,無需再次計算,因為選擇那些節點只會繞遠
2.障礙物節點加入closed表,對於被open或closed表包圍的節點,也加入closed表中
 
和Dijkstra算法的區別:
Dijkstra是BFS,不會去預估到終點的距離,因此在有多個權值相等的路徑時會搜索很多不必要的結點。而且沒有考慮障礙物
A*是按照啟發函數,向着目標搜。很適合尋路
Dijkstra會求出所有點的最短路徑, 得到理論上的最優解,而A*則只會找需要計算的點。結果是A*更快,但是不一定是最優解

 

 
Unity尋路
 
  1. AI使用NavMeshAgent組件
  2. 如果要配合物理引擎使用,則AI需要有kinematic的剛體,表示剛體由nav控制
  3. 和Animator配合使用的話,最好不要用root motion
  4. 將地面勾選Navigation Static,再打開Navigation視圖,點擊bake即可看到藍色可達區域
 
Navigation Area 可以設置object為不同Area,會用不同顏色表示
可以在NavMeshAgent中修改其可以行走的Area
 
Off Mesh Link 添加跳躍點(手動路徑)
默認的NaveMesh Agent組件上面是勾選了Auto Traverse Off Mesh Link(自動通過OffMeshLink)選項的。這樣的意思是人物只要到了OffMeshLink的開始點,就會自動的移動到OffMeshLink的結束點。 
 
Navmesh Obstacle
enable時不可通行,false時可通行。此情況下物體不會暫停
 
尋路還有很多用法,這里就暫不詳述了
 
AI感知事件
 
AI往往要感知視覺、聽覺等信息來決策下一步的行為,其中又包括位置信息,對象屬性信息,自身信息等
 
1、 輪詢(主動查詢信息)
輪詢類似編程中的switch-case,是AI周期性地查詢所需要的信息,輪詢非常常見,容易維護,但有效信息率低,花費性能較多
輪詢中心(沒有必要每個AI都進行一遍查詢,而是集中處理需要查詢的信息)
 
2、 事件驅動(被動得知信息)
事件是一種高效的消息傳遞機制,由事件分發者主動通知每個感興趣的AI,這樣就使AI准時獲得有效信息
可以做一個中心檢測系統(事件管理器),記錄每個AI感興趣的事件,並通知他們,還方便了調試
 
3、 Trigger觸發器
觸發器其實和事件比較接近,相比之下,觸發器是事件的本源,比如監聽聲音的聲音觸發器,檢測觀察物的視覺觸發器,等待時間的時間觸發器等等
 
Trigger 常用一個半徑計算檢測的范圍,
Sensor 感知器則定義了枚舉類型和變量,保存了事件管理器
視覺感知:圓錐形探測
聽覺感知:衰減范圍。而感知器也有對應的感知閾值
觸覺感知:碰撞器
記憶感知:記憶List+Time留存時間
……
 
FSM有限狀態機
finite-state machine 是表示有限個 狀態 以及在這些狀態之間的 轉移和動作等行為的數學模型。
最簡單的用enum+switch即可實現
 
在Unity中,我們可以用Animator或其他FSM框架實現可視化狀態機
但是對於一些復雜的AI,用FSM圖十分繁瑣,效率低且容易出錯,對一般的AI來說,FSM就足夠了
 
BehaviorTree行為樹
行為樹是由行為節點組成的樹狀結構
對於FSM,每個節點表示一個狀態,而對於BT,每個節點表示一個行為。
行為樹層次清晰,易於模塊化,封裝性好,可重用,是一種效果理想的AI編輯器
 
在BT中,節點是有層次(Hierarchical)的,子節點由其父節點來控制。
每個節點的執行都有一個結果(成功Success,失敗Failure或運行Running),該節點的執行結果都由其父節點來管理,從而決定接下來做什么,父節點的類型決定了不同的控制類型。
 
常見結點:Sequence, Selector,Parallel,Decorators
 
AI實例
AI包括設計和實現兩部分
 
AI設計
首先要根據需求,設計關卡中合適的AI,是個體還是集體,有什么特點,可行性,並制作相應的資源
AI的基本邏輯:感知-行動-反應-學習
AI的基本能力
AI的基本屬性
設計邏輯流程圖/狀態圖
設計AI使用技能,就好比調用一個結點
 
2D橫版AI
 
個體行動:待更新
集體戰術:夾擊,車輪,埋伏
 
3D平面AI
常見的技能行為有:追尋,連擊,遠程攻擊,固定線路攻擊,繞路,反向攻擊,跳起等等
 
 
關於Unity-AI的更多技術,我將另外寫篇博文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM