主題

【Unity 工具製作筆記】 做個 自動找路腳本

趴趴鼠Loading | 2021-01-01 19:15:00 | 巴幣 22 | 人氣 158

一些測試成果圖 (找出球體到圓柱體的路徑):




還有可以跳的設定 (球體上面藍色線代表球最高跳躍高度,所以它可以跳過牆壁)


腳本連結

以下是製作心得與筆記:


腳本最主要的方法就是 int FindPath(int count, Vector3 start, Vector3 previous, List<MovePoint> result)
原理是遞迴找到可到達的路徑,回傳0,或用光步數回傳-1代表失敗。

遞迴是種不斷call自己的方法,在方法跑到底之前不斷呼叫自己,造成佔據一堆記憶體。
我這個做法最容易讓程式當掉的地方是用split()方法分出太多路線,導致每個路線都要跑到結果才能釋放該路線的記憶體,在沒有優化的狀況下找路都可能跑個5分鐘以上。

邏輯:
每隔一段固定距離向目標點射出一個ray,若該ray沒打到障礙物,則可直行至該ray的盡頭。
→若打到物體,則判斷該障礙物是否可以跳過:

CheckCanJump()又分成判斷往上跳還是往下跳(跳下高台),
用畢氏定理射條剛好長度再多一點點的ray至牆壁,(不知道為甚麼高好長度的ray會偵測不到),看牆壁是否有高過這個ray的末端,被註解的Physics.CheckSphere作法也可以用。

→若是不可跨越的障礙物則沿著障礙物表面左右分裂出2條路線。
一開始先判斷 (hit.normal != previous_split_normal) 是減少split次數的做法,若這次打到的表面的法線方向與上一次分裂的相同,代表無須再分裂,繼續沿著目前的方向前行就好。

MovePoint型態目前只是簡單的紀錄位置,之後會多些狀態告訴移動的物件走到這個點該做的動作(?

Split方法:
第294~297行是將hit normal轉90度與-90度:
旋轉一個vector 90度的做法參考這篇
再乘個負號就變成-90度了。

第298、299的做法也可以,GetRotated_Pos()單純是:
return Quaternion.Euler(0, angle, 0) * (currentPos - center) + center;

檢查兩條分裂的路線有沒有與來的路線相交,有相交的話就可以刪掉。
檢查作法:
當初在做分離軸碰撞判斷時,大量用到線段相交判斷:(影片的腳本可以看myCollider core)

原理是分別將碰撞器A與碰撞器B的所有頂點投影在碰撞器A、B所有線段的法線上,比較該碰撞器A、B投影下最大與最小點,看是否交叉。
不過以上作法是因為碰撞器A和B是多邊形,所以要loop過所有頂點與線段,目前這個腳本只用到線段比較。


(因為太懶得畫示意圖,就直接用whiteboarding時的圖吧)
要用其中一條線當投影軸的原因是:
若投影軸單純用vector.up與vector.right,則下面這個情況會被當成有相交,但實際上並沒有。

將投影軸改以其中一條線為基準:(紅色箭頭代表v2線段的normal)

做這麼多就只是為了盡量減少split()分裂出線段

說到底這個腳本只是一堆if else的聚合物吧
更複雜的地形有可能找不到路,或是吃了一堆記憶體與種種效能問題。
也許像Unity內建的navigation先掃描地形的做法比較好,但之前用unity navigation時物件會奇怪的漂移,明明沒在走卻一直往某個地方飄移過去。 所以這次大膽做個尋路工具,不知道各位想法如何


雜記:
whiteboarding的過程




雜記2:
我思考就會拉肚子,尤其是打程式的時候
今天只喝了一杯咖啡、一杯牛奶和一條巧克力能量棒,在打這個腳本的期間拉了4次肚子,好奇測一下發現體重直接流掉半公斤,太棒了吧(?

創作回應

甜在心饅頭
乳糖不適症?腸胃不是不爭氣,偶爾也需要休息[e7]
2021-01-01 19:28:17
趴趴鼠Loading
聽說比較像是腸躁症,最高紀錄是有次我什麼都沒吃卻壞肚子6次[e21]
2021-01-01 20:35:34
is樂小呈
is樂小呈 遞迴用在這裡不太好吧,這樣要把每條路都走過一次诶?
navigation用的是A*算法,可以參考一下
2021-01-01 19:32:20
趴趴鼠Loading
感謝! 我來看看[e5]
2021-01-01 20:35:48
趴趴鼠Loading
突然想到,有辦法知道障礙物是可跨過的物件嗎?
2021-01-01 20:45:57
御安鴨鴨
超推A星算法的,可以參考這個影片https://www.bilibili.com/video/BV1vf4y1v7wU
2021-01-01 20:12:19
趴趴鼠Loading
感謝提供[e5] 重慶那個公路看起來有夠可怕
2021-01-01 20:36:23
追蹤 創作集

作者相關創作

更多創作