騎砍戰(zhàn)團引擎淺層剖析(三)碰撞機制
在騎砍戰(zhàn)團的1.161的modsystem(mod制作系統(tǒng)簡稱ms)中開放了一個新的操作cast ray,可用于檢測碰撞,這個碰撞檢測機理在unity中也有,所以這算是一個閹割版的UnityEngine.Physics.Raycast功能?;A(chǔ)原理都是從一個給定點發(fā)射一個無限長的射線或者給定長度的線段,當target層發(fā)生碰撞(相交),碰撞后得到碰撞體的信息,并返回值用于獲取碰撞的物體id和碰撞位置等信息。但是騎砍的這個Raycast功能不能指定碰撞層數(shù)(只能返回第一個碰撞層),能獲取的信息也只有前面所說的碰撞的物體id和碰撞位置(標準的UnityEngine.Physics.Raycast功能可以獲取的返回值及相關(guān)參數(shù)如下圖),所以我才叫它是閹割版Raycast。

雖然castray功能出現(xiàn)在戰(zhàn)團的1.161ms中,但并不能說明這是戰(zhàn)團的一個新技術(shù),其實經(jīng)過一些測試發(fā)現(xiàn),部分騎砍的碰撞是基于這個技術(shù)的,只不過直到1.161才將這個碰撞技術(shù)部分開發(fā)給mod制作者使用。那騎砍的碰撞究竟是怎樣實現(xiàn)的呢?
首先人的碰撞大部分不靠castray,如果你有半條命或CS的基礎(chǔ),就會發(fā)現(xiàn)騎砍的人單位和半條命模型動作處理上某些地方有相似,就是采用了hitbox(然而騎砍采用了模型動作貼圖分開管理,所以限制了單位多樣性,但有利于大戰(zhàn)場優(yōu)化,半條命采用模型動作貼圖封裝于一個mdl,對單體優(yōu)化有提高并且可以讓單位多樣化比如樹木桌椅也能使用骨骼動畫,當會面臨頂點上限等限制,所以半條命2就模仿md5mesh的模型技術(shù)將動作貼圖分離出mdl進行改進了),就是從人體身上取幾個關(guān)鍵點(手腳頭武器點等等)的坐標,因為骨骼動畫就是根據(jù)這些點進行對時間的矩陣變換形成一系列動作幀,所以理論上引擎可以實時獲取這些動態(tài)改變的hitbox坐標點,有了腳的坐標點,就可以控制這個點與地面坐標的關(guān)系做到地面碰撞檢測防止人物走著走著就沉下去或浮空;有了武器的坐標點,就可以將武器綁定在人體的合適武器,并且可以由此判斷攻擊范圍(武器坐標Y坐標前移一個武器長度,1.161后可獲取武器的長度重量等相關(guān)數(shù)據(jù))進而實現(xiàn)攻擊判定。
場景物體在開啟Physics dynamic即動態(tài)物理效果后,就會具有實時碰撞檢測特性,這個我猜測是基于castray的,并且動態(tài)物理效果戰(zhàn)團歷來就有,早于1.161,所以我說,castray其實本身就是戰(zhàn)團引擎的碰撞檢測功能,并非1.161開發(fā)僅為并非開放而已。至于為什么我推斷dynamic狀態(tài)的場景物碰撞判定使用了castray,因為我之前用過castray進行過碰撞試驗,發(fā)現(xiàn)射線的密度和碰撞面的棱角程度對碰撞檢測的靈敏性有影響,比如射線較少的時候,如果碰撞層是一個錐子而不是一個模型面較小而密的多面層或者整個碰撞接觸面一兩個模型面射線密度很小或涵蓋幾乎全面射線區(qū)域(即單個模型面很大,模型表面很平坦),你反復(fù)在這個碰撞阻隔的面上前移并且左右擺動,就會有幾率碰撞檢測失效而穿過碰撞面。而這一點在開啟Physics?dynamic后的場景物上也具有這樣的碰撞檢測局限(即碰撞面的平坦程度和模型單面與碰撞層的大小比例會造成碰撞判定不靈敏),所以推測開啟Physics?dynamic后的場景物碰撞是基于castray的,并且不開啟Physics?dynamic后的static狀態(tài)的場景物與人相對移動產(chǎn)生的碰撞效應(yīng)也是基于castray。也就是因為它采用castray群發(fā)射線,所以這樣的場景物和大量的人群沖撞,會直接卡頓一兩秒。
順便說一下,騎砍的castray和UnityEngine的castray還有一點特性也是滿足的,就是從有碰撞體的模型內(nèi)部往外射線是不能檢測到碰撞的。所以要把一個物體限制在另一個物體內(nèi)部運動是不采用castray碰撞檢測原理的。