此問題是在做特殊關卡遇到的,一個可以移動的碰撞體如果速度過快會穿過另一個碰撞體,慢的話是可以的,問題原因找到了,只需要一個設置就行
對於Unity引擎而言,是可以直接解決這個問題的。
Unity的Rigidbody里有個Collision Detection的碰撞檢測屬性。
該屬性有三個選項:Discrete(離散), Continuous(連續), Continuous Dynamic(動態連續)。
其中的Discreet一詞應為筆誤,實為Discrete(Discreet意為慎重,兩者意思相差很大)。整個Manual里沒有第二處用到Discreet的地方,也沒有任何官方說明提到該詞。
翻譯過來基本上就是
碰撞檢測屬性:用於防止快速移動的物體穿過其他物體而不觸發碰撞檢測。
離散(Discrete):
- 碰撞體在遇到本場景其他碰撞體時使用離散式碰撞檢測(Discrete)。
- 其他碰撞體在遇到它時會使用離散式碰撞檢測(Discrete)。
- 用於正常碰撞。(這是默認值)
連續(Continuous):
- 碰撞體在遇到其他動態碰撞體(即包含rigidbody)使用離散式碰撞檢測(Discrete),在遇到靜態MechColliders(即不含rigidbody)時使用連續式碰撞檢測(Continuous)。
- 設為動態連續(Continuous Dynamic)的碰撞體在遇到該物體時使用連續式碰撞檢測(Continuous), 其他碰撞體在遇到該物體時使用離散式碰撞檢測(Discrete)。
- 用於設定被動態連續(Continuous Dynamic)的物體所碰撞的物體。(會影響物理引擎的性能表現。如果你沒有快速運動物體的碰撞問題,就乖乖設為離散吧)
動態連續(Continuous Dynamic):
- 碰撞體在遇到其他設為連續(Continuous)或動態連續(Continuous Dynamic)的物體時使用連續式碰撞檢測(Continuous)。在遇到靜態MeshColliders(即不含rigidbody)時也使用連續式的碰撞檢測。遇到其他碰撞體則使用離散式碰撞檢測(Discrete)。
- 用於快速運動的物體。
理成一個碰撞檢測屬性與碰撞檢測方式的對應表格就是:
如果你有一個快速運動的小球,它會穿過一個靜態的牆,那么將球設為Continuous即可解決問題。
但如果你有多個這樣的小球,它們之間則依舊會遇到互相穿過對方的問題,那么將球都設為Continuous Dynamic更好。
所以遇到題主的問題時,將快速運動的物體設為Continuous/Continuous Dynamic即可。
理論上你可以設定所有物體為Continuous Dynamic,然而這樣的物體數量一旦增加起來,對性能會有很大的影響。
因為我這是2D,只有一個Continuous屬性, 選擇后在運行,OK,沒問題了