使用unity如何在低幀率下實現高速穿透子彈?

時間 2021-05-06 13:57:55

1樓:穩單獨行俠

看到某個回答裡提問者說是因為是幀同步才會10幀,具體是什麼遊戲型別不清楚,不過如果是實時操作而非回合制遊戲,這個幀數確實太低了,至少影響正常的操作體驗。也就是會出現一段操作猛如虎,看看畫面才動了一步的情況,遊戲體驗極差。另外,既然是幀同步,那就是具體資料以伺服器為準,那麼自然也是由伺服器來計算碰撞,壓根就不是客戶端想著怎麼判斷這個碰撞問題。

既然是伺服器問題,那就直接自己計算吧,不用考慮unity的物理引擎。如果是客戶端是server+client的結構來做,那麼表現用高幀率就行,不會影響低幀率的資料同步,資料和顯示分離開就簡單了。

2樓:行甫

考慮到各種情況,「子彈」這種高速物體的實現會採用多種方式,以下列出常用的兩種。

1 建立物理剛體,要建立的非常細長,保證子彈在某個幀率之上的高速運動不會發生「模型穿透」。但在幀率超級低的情況,還是會發生穿透,效能也不是特別好。一般會在速度不是「特別快」,數量也不多的攻擊體上使用,例如火箭彈。

2 使用射線,在開槍的一瞬間就計算是否有命中。當然,你可以給子彈設定速度以換算飛行時間,疊加各種力函式模擬物理效果等等。比如一顆子彈射線設定飛行時間為100秒,在開槍的一瞬間,射線命中2人,子彈飛抵他們的時間距離分別為30秒和60秒,所以等到30和60秒的時候,再計算一下他們是否還在原位置,就知道本次子彈是否命中了。

這種方式雖然可以完美解決「模型穿透」問題效能也不錯,但無法擊中在半途加入到彈道內的敵人,所以適用超高速且數量極多的子彈場景。

3樓:喝十八

射擊之類的東西用raycast或spherecast. 另外unity 很快會支援非同步cast,對需要大量CAST的情況會是個大利好

4樓:Unity3d遊戲開發指南

下面的兩種方法都可以嘗試下

A:把子彈設成trigger試試,另外別銷毀子彈,要是還不行就給子彈乙個實體和速度後再對子彈不同時刻不同位置之間進行射線檢測

B:這裡的子彈用射線,通過讀取表中是否有穿透屬性這一項,決定是raycast還是raycastall 如果穿透就返回所有碰撞資訊

5樓:

推薦射線法或類似的方法來模擬CCD。首先你不是每幀都發射線而是一顆子彈1次(或者說3次),只要不是場景碰撞盒特別複雜的,射線的效能消耗完全可以接受。

trigger不能ccd的問題暫時沒救。

還有個思路是不用trigger,接觸時關collider並人工判定穿透後出來的位置和速度(可通過接觸點和接觸速度算出),然後強制位移和設定速度並開collider。

6樓:yuyu大肥貓

不用線段跟box/sphere求交也行

在兩幀之間根據位置做一些差值,轉換成多個靜態幀中,box/sphere之間相交的問題

優點是兩個靜止的box或者sphere比有運動軌跡的求交更簡單,缺點就是,仍然會有穿透現象發生。

想減少穿透發生只能取更小的差值步長,當然檢測次數就會增加。

參考閱讀《實時碰撞檢測演算法》

7樓:

上一幀子彈位置和當前幀子彈位置連成一條線段,目標物體運動速度不大的話用當前幀位置,碰撞體簡化為Box/Sphere。

問題可以簡化為線段和Box/Sphere的求交問題,只要線段和碰撞體相交了就算擊中。

自己用C#寫個就好,就不用管Tigger不Trigger了。

開銷看碰撞體和子彈數目,自己profile一下,需要優化的話用一些常用的空間分割演算法就可以。

8樓:zerro

我傾向於射線,按你描述的需求來看,子彈有飛行時間,超過距離的就可以pass掉,根本不需要算完再排序什麼的,可優化空間很大,開銷應該可控

如何在Unity中實現一根有彈性的魚竿?

dxxd 可以用貝塞爾曲線實現,修改模型的mesh頂點 逍遙劍客 問題可以簡化,變成乙個數學問題.UE4用著熟,就拿這個當例子,參考資料是Unity的 對於魚竿來說,其實我們只需要保證杆尾這個點是彈性運動即可,那麼問題就是變成了直杆與彎杆的端點位置的彈性運動,這個只用乙個PhysicsConstra...

如何在 Windows 下使用 Day One?

Day One 原本有乙個 Chrome 瀏覽器外掛程式,但後來官方把外掛程式下架了,目前僅有支援 Safari 瀏覽器的外掛程式。在 Day One 官網看到後續會重新推出 Chrome 外掛程式的公告,請靜候佳音。 Salmon 印象筆記 IFTTT Day one 在印象筆記中寫完,打上tag...

Unity2D如何實現同時按「下 跳」跳下平台?

ANDALASASUN U3D實現這個其實很簡單,用PlatformEffector2D 把這個元件掛到你的平台上,檢測你的按鍵是否按了向下這個鍵,如果按鍵是ON的話,就讓PlatformEffector2D 元件中的colliderMask過濾掉主角這個層 寫法是colliderMask 0 你要...