遊戲行業的人工智慧設計(二) 路徑搜尋和感知

2021-07-04 10:34:09 字數 4619 閱讀 9986

本文非常接近真正的人工智慧 (ai)。 所有智慧型**都需要具備感知環境的基本能力,並擁有在周圍世界(無論是真實世界還是虛擬世界)中導航和移動的一些手段。 儘管方法有很大不同,但您的實體也需要具備這樣的能力。 您也可以投機取巧,以確保一切快速順暢地執行。

人工智慧的感知方法

讓**作出武斷決定適用於某些遊戲,但如果您需要更多能力呢? 如果您的**將作出適當的決策,那麼它需要了解周圍發生的事情。 在人工智慧的機械人應用中,做了大量關於計算機視覺方面的研究,為機械人提供了以真實、立體的三維 (3d) 視覺感知周圍環境的能力,就像人類一樣。這種成熟水平對於我們來說是完全多餘的。

相較於真實世界的人工智慧機械人,大多數遊戲所用的虛擬世界擁有巨大優勢。 我們世界中的一切都是已知量: 遊戲中有乙個列表,其中包含遊戲裡的一切。 您可以在這一列表中搜尋任何標準,然後立即獲取**所用的資訊,以制定更有意義的決策。

視覺偽造實體視覺是為**提供感知能力的最基本層次。 您可以通過在實體列表中搜尋特定範圍內的一切來做到這一點。 您既可以獲取**感興趣的首要事件,也可以獲取範圍之內的事件列表,以便您的**針對周圍環境作出最佳決策。

這一設定適用於簡單遊戲,但當您的遊戲風格較複雜時,如間諜遊戲或第一人稱的戰術射擊遊戲 (fps),您的**將需要在「看到」的內容上更具有選擇性。 如果您不希望**眼觀四面,您可以針對超過實體視線範圍之外的任意內容的潛力篩選出乙個列表。 只需用一點數學知識就可以快速完成這一工作:

從**的位置減去目標位置,計算考慮中的**和實體之間的向量。

計算向量和**所看方向之間的角度。(如果已經不是乙個向量,您也可以計算出數值)。

如果角度的絕對值大於**的預設視角,您的**看不到實體。

在較複雜的遊戲中,您可能需要考慮某種遮蔽物隱藏的玩家或其他實體。 對於此類遊戲,您可能需要執行光線追蹤 (有時稱為光線投射),以了解是否有東西阻擋了潛在目標。 光線追蹤是一種檢查光線是否貫穿任何東西的數學方法,從乙個點開始,以固定方向移動。 遊戲引擎提供了光線追蹤功能,但如果您想要了解其詳情,請參見「三個臭皮匠抵乙個諸葛亮」。

之前的方法告訴您是否有東西遮蓋了目標中心,但可能不足以阻止您的**。 有可能**的中心被遮蔽,但**的上部在遮蔽物上方伸出。 在目標上的特定關注點使用多個光線追蹤不僅可以幫助確定 能否擊中目標,還可以確定能夠擊中目標的哪個位置。

聲音乍看起來,它可能像是與視線無異的聲音。 如果您可以看到實體,您肯定也能聽到。 的確,如果您的**發現了實體,**可以主動檢測實體所作的任何事情,直到從視線中完全消失。 但是,為**新增額外的聽覺水平可幫助視覺更有效地工作。 跟蹤實體發出的作為感知水平的雜訊對於任何隱蔽類遊戲都至關重要。

和視覺一樣,您需要獲取乙個附近實體的列表以便核對。 您可以再次通過簡單的距離檢查完成這項工作,但篩選這一列表的方式不同。

如果您想要考慮障礙,則可以再一次篩選這一列表:對環境執行光線追蹤,了解是否有東西阻擋聲音。 由於很少有材料是完全隔音的,因此您需要以更具創造性的方式從列表中刪除實體。

其他感官

為**提供視覺和聽覺所需的基本功能可以很輕鬆地應用到模擬其他感官上。 這裡有乙個其他潛在感覺的列表,如果設計需要,您可以新增到遊戲中:

雷達。有些遊戲為玩家提供個人雷達,這使得感知變得更簡單。 只需乙個簡單的半徑檢查即可。 隨後人工智慧便可以驗證結果,了解其影響。 對於團隊遊戲,雷達本身可以變得更加有趣。 為了彙總基於團隊的人工智慧,每個團隊需要制定乙個包含雷達發現的實體的雷達列表。 然後團隊的每個成員便可以只針對已知實體的列表執行半徑檢查,以確定團隊是否應該做出響應。 團隊可以使用雷達裝置(如深入敵後: 雷神戰爭*遊戲中),按照新增「看到」的任何內容的每個團隊編號新增至列表中。 這一行為可幫助實體作為乙個部隊工作,因為每個實體都會將其看到的內容告知其他實體。

觸控。這種感覺比較輕而易舉,因為遊戲引擎的碰撞系統會自動涵蓋它。 您只需確保智慧型**能夠響應損壞和碰撞事件即可。

味覺。我不確定這種感覺如何運作。 它可能是氣味的一種屬性,但需要**主動「品嚐」其發現的東西。

能夠感知周圍世界當然很好,但**應該感知到什麼呢? 您需要指定並能夠確定通過**的設定進行觀察的事物。 當您認出看到的事物,您的**可以根據管理實體的規則對其作出響應。

臨時實體

臨時實體有時也稱為粒子、貼標或特效,是遊戲世界中的視覺效果。 它們與實體類似,因為乙個總體類結構定義所有潛在臨時實體,但它們又不同於實體,因為它們不思考和響應遊戲世界中的實體,也不與實體互動或相互響應或互動。 他們唯一的目的就是為了美觀,在一段時間內為遊戲世界提供額外細節,然後就會死去。 臨時實體用於子彈軌跡、煙霧、火花、血噴甚至腳印等事物。

臨時實體的性質意味著處理很少且無碰撞檢測(超出非常簡單的世界碰撞)。 問題在於,有些臨時實體為玩家提供了有關已發生事件的視覺線索(彈孔和燒傷痕跡表示最近發生過戰鬥,雪地上的腳印可幫助找到潛在目標),那麼為何您的智慧型**也不能使用它呢?

此問題有兩種解決方法: 您既可以通過增強臨時實體系統來支援光線追蹤(會破壞乙個臨時實體系統的整點),也可以在臨時實體的一般臨近區域投下乙個空實體。 這一空白實體沒有思考能力,也沒有與其相關的影象,但您的**能夠檢測到它,並且臨時實體擁有為**提供「英特爾」的相關資訊。 因此,當一灘散血效果掉落在地上時,您可以在那裡投下乙個無形實體,讓您的**知道有不尋常的事情發生了。 對於腳印的問題,您已經有掩護它的線索了。

掩護在很多射擊遊戲中,如果您的**可以聰明地躲在掩護後面,而不是只是站在空地處等著被擊中,那真是太好了。 這個問題比我之前介紹的其他問題更專業一些。 您的**如何確定是否有可以躲藏的可用掩護?

實際上,這一窘境是兩個問題: 如何從實際幾何結構方面確定掩護物,以及如何從實際實體方面確定掩護物(如上述的漫畫所示)。 如要確定乙個實體是否能夠阻擋攻擊,您可以簡單地驗證一下,比較一下選中的掩護物的邊框尺寸。 然後,驗證一下您的實體是否能夠躲在它後面。 驗證方法是,從射擊者和掩護物的不同位置建立一束光。 利用這束光來確定(從射擊者)穿過掩護物的點是否不會造成影響,然後將該區域標記為**的下乙個目標。

ai 導航

目前為止,我已經聊了許多人工智慧如何做決定及其如何知道將會發生什麼(以便做出更好的決定)。 現在,我們來了解一下人工智慧如何執行這些決定。 接下來是要確定如何從 a 點到 b 點。您可以使用多種方法,具體取決於遊戲的性質和效能需求的級別。

碰撞和轉彎

碰撞和轉彎是產生實體運動最基本的方式之一。 下面介紹一下它的工作原理:

在目標方向移動。

如果撞到一面牆,轉向讓你距離目標最近的方向。 如果沒有明顯更好的選擇,請隨機選擇乙個。

這種方法對於簡單的遊戲非常有效。 數不勝數的遊戲使用這種方法來控制怪獸如何追趕玩家。 碰撞和轉彎導致實體在追趕玩家時卡在凹陷的牆或角落中,因此,對於有殭屍或沒有這種地貌的遊戲,這種方法非常理想。

但是,如果遊戲要求**更機敏,您可以對簡單的碰撞和轉彎進行更詳細地介紹,為您的**賦予一些記憶。 如果**能夠記住他們到過**,則可對如何轉彎做出更有意義的決定。 轉完所有彎後,**將可原路返回,做不同的決定。 因此,您的**能夠系統搜尋乙個目標的路線。 下面介紹一下它的工作原理:

向目標移動。

遇到叉路時做選擇。

發現死路時,原路返回到上一選擇,再做其他選擇。

探索全部可行路線後,放棄。

這種方法在處理方面不會耗費大量資源,這表示,您支援大量**也不會降低遊戲速度。 這種方法還非常適合處理多執行緒。 這種方法的缺點是會浪費大量空間,因為每位**都可能會追蹤包括全部可行路線在內的整個地圖。

幸運的是,讓**在共享記憶體中記錄路線,將可避免這一浪費。 但是,可能會產生執行緒衝突的問題;因此需要將實體路線儲存在乙個所有**都能夠在移動時向其傳送請求,在發現新路線時向其傳送更新的單獨模組中。 然後,路線地圖模組還需要能夠解析發現的路線,以避免出現衝突。

路線查詢

通過碰撞和轉彎生成地圖是適應不斷變化的地圖的好方法。 在策略遊戲中,玩家不能坐等裝置來查詢他們的方位。 而且,這些路線圖可能會變得非常龐大,這樣,在其中搜尋正確的路線將會成為瓶頸。 查詢救援路線。

路線查詢問題在遊戲開發中基本上已經解決。 像最初的星際爭霸 (starcraft)* (美國暴雪娛樂公司 (blizzard entertainment*))一樣老的遊戲都可以處理大量遊戲實體,在大型的複雜地圖中找到道路。

首先,必須建立兩個列表:乙個包含尚未核實的節點的列表(未核實),乙個包含已核實的節點的列表(已核實)。 每個列表包含乙個位置節點、與目標之間的預估距離及其母節點(確保其位於列表中的節點)的引數。 列表最初為空。

接下來,將起點新增到未核實列表中,無母節點。 然後,輸入演算法:

從列表中選擇外觀最佳的節點。

如果該節點是目標,則操作即可完成。

如果該節點不是目標,則需要將其新增至已核實列表。

對於與該節點相鄰的每個節點:

如果節點無法行走,則忽略它。

如果節點已在列表中(無論是已核實或未核實),則忽略它。

接下來,將其新增到未核實列表中,將該節點設定為母節點,並預估其到目標的距離(粗略的距離檢查即可)。

在路線查詢子系統中,多執行緒處理還可提高系統的效能。 它非常適合實時策略 (rts) 遊戲,或包含大量實體且每個實體都在尋找不同路線的系統。 可同時在不同執行緒內查詢到多條路線。 當然,系統需要記錄發現的路線。 同一條路線無需多次發現。

**示例

以下展示了乙個僅在 c 語言中部署的 a* 示例。簡便起見,我在示例中並未考慮支援函式,因為它們需要針對不同的部署風格進行定製。 本示例基於乙個簡單的 tile 網格,其中每個 tile 都可以進一步處理,也可不處理。 這僅允許移動到相鄰 tile,但是,如果進行微小的改動,便能夠允許作對角移動,或者六角形遊戲布局。

**請參照原文:

遊戲開發中的人工智慧

今天非常開心,cocos官方直播居然在幾千人中中獎,可以買彩票了。言歸正傳,所謂的人工智慧,也就是大家常說的ai artificial intelligence 一說到ai可能就會讓人覺得比較深奧,其實也就是非玩家角色思考和行為的綜合。比如,在什麼樣的條件下,觸發什麼樣的行為。其實我們在遊戲開發中的...

遊戲程式設計中的人工智慧 補

先抱怨下windows 64bit下的交叉編譯簡直折磨死人,倒騰了幾天之後決定還是切到linux下算了。虛擬機器雖然不給力,但是好歹能看出來優化後的結果。本文沒什麼講的,只是將上文說到的掃雷機的進化過程中耗時最長的函式用c重新寫一遍後比較下執行速度,廢話不多說,直接貼 看結果。原來判斷兩條直線ab和...

Forecast的人工智慧

forecast智慧型專案管理軟體 人工智慧 英語 artificial intelligence,ai 亦稱機器智慧型,是指由人工製造出來的系統所表現出來的智慧型。通常人工智慧是指通過普通電腦實現的智慧型。人工智慧的研究可以分為幾個技術問題。其分支領域主要集中在解決具體問題,其中之一是,如何使用各...