unity-AI設計理念和編程思想(三)

    前兩個模塊大致講了講AI角色的感知和自主決策,決策之後呢?當然就要開始行動了。比如AI角色發現一個目標,並決定去攻擊它,但它與目標之間可能還有一段距離,AI角色需要先到達目標點,這就需要AI角色自主尋路了,還有玩家點擊地圖上的某點,尋路模塊需要找到一個最佳路線趕過去。最常用的便是A*尋路了,當然unity自帶的Navmesh導航網絡也是基於此算法。

    A*尋路常用術語:

    地圖:它是一個空間,定義了場景中相互連接的可行走區域。A*在這個空間內尋找兩個點之間的路徑。

    目標估計:尋路過程中估算代價,顯得更智能。

    代價:尋路過程中,可能有很多影響因素,包括時間、地形、距離等等,它們都會有不同的代價,我們要做的是尋找到一條代價最小的路徑。

    節點:節點與地圖上的位置相對應,用來記錄搜索進度。它存放的有當前節點的位置信息,還有父節點(上一個節點)。每個節點有三個屬性值,分別是g,h,f。

        g: 起始節點到當前節點的代價

        h:從當前節點到目標節點的估計代價(不考慮障礙物)。

        f:是經過當前節點這條路徑代價的最好估計值,f值越小路徑越好。f=g+h

    導航圖:要進行尋路,需要將遊戲環境用一個圖表示出來,最重要的有三種格式:基於單元的導航圖、可視點導航圖、導航網絡。

三種導航圖的建立以及優缺點:

    基於單元的導航圖:將遊戲地圖劃分爲多個正方形單元或六邊形單元組成的規格網絡,網格點或網格中心點可以看作節點。    

        優勢:結構簡單,易於動態更新,動態增加建築物或障礙物,所以常用在塔防遊戲等頻繁更新場景的遊戲中。

        缺點:節點太多,消耗內存,RTS遊戲尋路物體多時會消耗大量CPU,對於複雜地形效果不佳。

    創建可視點導航圖:場景設計者在場景中放置一些路徑點,如果兩點之間沒有障礙物,說明兩點之間可以“看見”,可以用一條線段把兩個點連接起來,生成邊,很多這樣的邊就可以組成導航網絡。

        優勢:靈活,場景設計者可以精心選擇,對於複雜地形會有比較好的效果。

        缺點:場景很大時,手工放置工作量大且易出錯;由於AI角色是沿着“邊”走,可能不是最佳路線,會走“Z"字形路線。而且如果路徑點之間是懸崖時,它可能會跌落懸崖。

    導航網絡:它將遊戲場景可行走區域劃分爲凸多邊形,每個凸多邊形代表一個節點,代價可以把多邊形的質心之間的線段長度。

    優勢:可以進行精確的點到點的移動,由於凸多邊形面積可以任意大,所以佔用的內存小,搜索速度很快。

    缺點:生成導航網絡(烘培)時間較長,特別是地形複雜且多的地圖。雖然unity添加了動態避障的功能,但每次都得重新烘培一次,所以多用於靜態場景中。

————————————————————————————————————————————————————

   A*尋路算法是如何工作的?

    A*算法使用兩個狀態表來存儲不同的節點,分別是Open表,由待考察的節點組成。Closed表由已經考察過的節點(算法檢查過與它相鄰的所有節點,計算出它們之間的f,g,h值,並放入Open表中待考察)組成。 開始時,Closed表爲空,Open表只包括起始節點。每次迭代中,將Open表中代價最小的點取出來檢查,如果不是目標節點,那麼考慮該節點的相鄰節點,對相鄰節點做如下處理:

    1. 不在Open表和Closed表中,則加入Open表中。

    2. 已經在Open表中,且新路徑具有更低代價,更新它的信息。

    3. 在closed表中,檢查新路徑是否有更低的代價,是的話將其加入Open表中,否則忽略。

重複上述步驟,直到達到目標點,如果到達目標點之前,open表已經變空,說明沒有可達路徑。

A*算法實現戰術尋路:

    很多時候,最短路徑並不是最好的選擇,一些情況下,我們希望AI角色更聰明靈活,需要用到戰術尋路。怎麼實現呢?我們需要給一些區域賦予不同的代價值,比如高危區域代價加100,普通危險區域代價加50,安全區域代價不變。A*就會盡量避免這些高代價區域。

A* Pathfinding Project插件:大佬貢獻的插件,可以修改代碼,當你彷徨無措是總會有大佬把飯端到你嘴邊。感謝!這裏不多介紹這個插件了。

發佈了45 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章