【A*Pathfinding】超級簡單的Unity2D尋路

作者:Yumir
哈嘍~我是yumir。
寫過俯視角射擊和“元?dú)怛T士”地圖生成之后,不做個(gè)敵人AI總覺得差點(diǎn)什么,所以又研究了一下Unity的2D尋路。
傳送門:這次我用的是A*Pathfinding的免費(fèi)版。
獲取方法:
在官網(wǎng):https://arongranberg.com/astar/? 點(diǎn)擊Download選項(xiàng),在跳轉(zhuǎn)到的頁面上選擇下載”Free“版本,將下載下來的文件導(dǎo)入到unity中,就可以開始我們的大事業(yè)了。
一、設(shè)置尋路網(wǎng)格
雖然也可以腳本控制,但是建議先簡單搭建一個(gè)場景熟悉下插件,而且能不寫代碼就完成功能我覺得香得很~
在搭建好的場景中新建一個(gè)空物體,點(diǎn)擊”AddComponent“搜索”Pathfinder“添加該組件。添加組件之后面板顯示如下,點(diǎn)擊圖中框選按鈕添加Grid Graph(Graphs>Grid Graph)。

由于我做的是2D尋路,所以將”2D“和”Use 2D Physic“勾選,使用2D模式,再在第三個(gè)紅框的位置選擇一個(gè)Layer,這個(gè)Layer表示”不能行走“的范圍,也就是障礙物,做這一步的同時(shí)需要將場景中的障礙物的Layer都設(shè)置為對應(yīng)的Layer。

”Width“和”Depth“分別表示網(wǎng)格的長高,單位是”nodes“也就是有幾個(gè)格子。下面的”Node size“ 表示格子的大小也可以理解為網(wǎng)格的精度,這些都根據(jù)需求調(diào)整。點(diǎn)擊下方的Scan按鈕,就會掃描生成尋路網(wǎng)格,紅色方框的部分代表不可行走,藍(lán)色部分則反之。

那么動態(tài)生成的地圖應(yīng)該怎么烘焙網(wǎng)格呢,設(shè)置一張對應(yīng)大小的網(wǎng)格然后在地圖生成結(jié)束的時(shí)候調(diào)用插件提供的方法即可:
GetComponent<AstarPath>().Scan();
?
二、讓敵人找到玩家
首先我們需要一個(gè)迷人的反派角色,我把玩家的貼圖疊了一層紅色畫了個(gè)紅眼睛用來充當(dāng),效果還不錯(cuò)。

新建一個(gè)空物體作為反派角色的父物體,在該物體上添加”AI Path“組件,而后系統(tǒng)會自動添加另一個(gè)組件”Seeker“,這是因?yàn)锳I Path需要利用Seeker來尋路,放著別動就行,除非你打算自定義一個(gè)AI Path。
再添加一個(gè)”AI Destination Setter“組件,該組件負(fù)責(zé)更新目標(biāo)位置。

AI Path主要修改以下內(nèi)容:Orientation、Enable Rotation、Gravity。

再將玩家角色拖拽到AI Destination Setter的Target上,點(diǎn)擊運(yùn)行就可以看到尋路的效果。

三、簡單AI實(shí)現(xiàn)
迷人的反派角色當(dāng)然不能只是跟屁蟲,這里給他寫一個(gè)簡單的狀態(tài)機(jī),分別又待機(jī)、追逐、攻擊三個(gè)狀態(tài):
enum EnemyState
{
??? Idle,
??? Tracking,
??? Attack
}
?
在Update中根據(jù)當(dāng)前的狀態(tài)類型分別調(diào)用對應(yīng)的方法:
??????? switch (enemyState)
??????? {
??????????? case EnemyState.Idle:
??????????????? Idle();
??????????????? break;
??????????? case EnemyState.Tracking:
??????????????? Tracking();
??????????????? break;
??????????? case EnemyState.Attack:
??????????????? Attack();
??????????????? break;
??????????? default:
??????????????? break;
??????? }
?
AI Path沒有提供停止尋路的接口,但是沒關(guān)系,將速度設(shè)置為零就可以讓他停下了。在各自的狀態(tài)方法中改變當(dāng)前的速度、狀態(tài)類型、和動畫:
AIPath.maxSpeed = speed;
enemyState = EnemyState.Tracking;
enemyModel.GetComponent<Animator>().SetBool("walk", true);
?
加上和玩家相互攻擊的邏輯就是一個(gè)小游戲啦。
鏈接:https://pan.baidu.com/share/init?surl=khG-XNnPQIoXBmIj5VejEQ
提取碼:kkm8

~~~分割線~~~
歡迎加入游戲開發(fā)群歡樂攪基:610475807
對游戲開發(fā)感興趣的童鞋可戳這里進(jìn)一步了解:http://www.levelpp.com/