A star pathfinding project插件點(diǎn)到點(diǎn)尋路
A*的插件和導(dǎo)入省略筛严。
首先搭建一個(gè)如下的場(chǎng)景用于演示:
- 添加一個(gè)空物體忙迁,將它命名為A,接著添加A中最重要的腳本pathFinder
- 接著在在腳本中選擇,Graphs進(jìn)行之前提到的像素化地圖乐纸。
- 這里進(jìn)行Grid Graph(格子)的像素化地圖常柄。
- 接著在Scene面板中鲤氢,我們可以看見以A*空物體為原點(diǎn)的一邊區(qū)域的地圖以格子的形式被像素化。
- 由于我們的Plane的尺寸是55的西潘,所以我們對(duì)A的尺寸進(jìn)行同化卷玉。(注意也需將Center的坐標(biāo)對(duì)應(yīng))
- 接著我們可以得到整張像素化的地圖。
- 接著添加兩個(gè)層喷市。(obstacles和Ground),分別給Cube和Plane添加相种。
- 由于障礙物是需要碰撞的所以,我們?cè)贑ollision testing Mask添加obstacles品姓,并把高度測(cè)試Height testing Mask選擇為Ground寝并。
- 這樣我們A*的環(huán)境就基本搭建完成。
- 接著我們?yōu)槲覀兊膱?chǎng)景創(chuàng)建一個(gè)A角色腹备,并為它添加插件中的(Seeker腳本用于獲取路線和尋路)衬潦,添加Character Contorller,和我們用于控制整體的自己編寫的AstarAI腳本植酥。
- 進(jìn)行AstarAI 腳本的編寫镀岛。
- 首先我們定義好我們需要使用到的屬性弦牡,Path屬性來(lái)自于插件,需要引入命名空間漂羊。
- 在Start中初始化驾锰,使用seeker的StartPath開始進(jìn)行尋路
- 注意這里的 seeker.pathCallback是需要一個(gè)Path對(duì)象為參數(shù)無(wú)返回值的委托代理。我們可以查看API
- 所以我們定一個(gè)方法作為它的回調(diào)函數(shù)走越。
- 如果物體銷毀了椭豫,我們就不在給它傳輸路徑。
- 接著在FixedUpdate中進(jìn)行判斷旨指,它是否沒(méi)找到路徑或者已經(jīng)到達(dá)終點(diǎn)赏酥。
- 如果不是以上兩種情況,我們則進(jìn)行尋路算法的實(shí)現(xiàn)淤毛。
- 計(jì)算當(dāng)前路徑節(jié)點(diǎn)和物體當(dāng)前位置的向量今缚,由于只需要方向,所以單位化低淡,使用Character Contorller的SimpleMove進(jìn)行移動(dòng)
- 最后使用四元數(shù)的LookRotation方法更新朝向姓言。
- 實(shí)現(xiàn)簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)式的尋路
實(shí)現(xiàn)在多點(diǎn)中找尋最近的一個(gè)點(diǎn)。使用seeker的StartMultiTargetPath方法
- 搭建場(chǎng)景
- 其他操作同之前一樣蔗蹋。
- 將需要作為尋路的物體放在targets下作為子物體何荚。
- 為AIPlayer替換MutiTargetPath腳本,并編寫猪杭。
- 遍歷targets的子物體并保存在endpoints中餐塘。
- 使用seeker的StartMultiTargetPath方法進(jìn)行實(shí)現(xiàn)。
-
演示: