






→若打到物體,則判斷該障礙物是否可以跳過(guò):
用畢氏定理射條剛好長(zhǎng)度再多一點(diǎn)點(diǎn)的ray至牆壁,(不知道為甚麼高好長(zhǎng)度的ray會(huì)偵測(cè)不到),看牆壁是否有高過(guò)這個(gè)ray的末端,被註解的Physics.CheckSphere作法也可以用。→若是不可跨越的障礙物則沿著障礙物表面左右分裂出2條路線。一開(kāi)始先判斷 (hit.normal != previous_split_normal) 是減少split次數(shù)的做法,若這次打到的表面的法線方向與上一次分裂的相同,代表無(wú)須再分裂,繼續(xù)沿著目前的方向前行就好。MovePoint型態(tài)目前只是簡(jiǎn)單的紀(jì)錄位置,之後會(huì)多些狀態(tài)告訴移動(dòng)的物件走到這個(gè)點(diǎn)該做的動(dòng)作(?Split方法:第294~297行是將hit normal轉(zhuǎn)90度與-90度:旋轉(zhuǎn)一個(gè)vector 90度的做法參考這篇。再乘個(gè)負(fù)號(hào)就變成-90度了。第298、299的做法也可以,GetRotated_Pos()單純是:
return Quaternion.Euler(0, angle, 0) * (currentPos - center) + center;
檢查兩條分裂的路線有沒(méi)有與來(lái)的路線相交,有相交的話就可以刪掉。
檢查作法:
當(dāng)初在做分離軸碰撞判斷時(shí),大量用到線段相交判斷:(影片的腳本可以看myCollider 和 core)原理是分別將碰撞器A與碰撞器B的所有頂點(diǎn)投影在碰撞器A、B所有線段的法線上,比較該碰撞器A、B投影下最大與最小點(diǎn),看是否交叉。不過(guò)以上作法是因?yàn)榕鲎财鰽和B是多邊形,所以要loop過(guò)所有頂點(diǎn)與線段,目前這個(gè)腳本只用到線段比較。
(因?yàn)樘珣械卯?huà)示意圖,就直接用whiteboarding時(shí)的圖吧)
要用其中一條線當(dāng)投影軸的原因是:
若投影軸單純用vector.up與vector.right,則下面這個(gè)情況會(huì)被當(dāng)成有相交,但實(shí)際上並沒(méi)有。
將投影軸改以其中一條線為基準(zhǔn):(紅色箭頭代表v2線段的normal)
做這麼多就只是為了盡量減少split()分裂出線段



雜記:


