2014-01-30 51 views
4

我有一個硬幣(剛體)和圍繞它的箱壁碰撞體。爲了試用目的,我已將以下代碼應用於硬幣。如何防止RigidBody穿過其他碰撞體

void OnMouseDown() { 
    rigidbody.AddForce(30.0f,0f,5.0f, ForceMode.Impulse); 
} 

但是,有時硬幣會穿過牆壁,但是當我將速度從30增加到50點時,它會在第一次點擊時穿過牆壁。我google了很多,除了DontGoThroughThings腳本沒有任何作用,或者我真的不知道如何使用它以外,什麼都沒有。

我一直在硬幣上添加一個連續的動態和牆上的連續碰撞檢測,但仍然不起作用。

+0

http://stackoverflow.com/questions/5788261/fast-moving-object-passing-through-other-objects – jparimaa

+0

我還沒有任何有效的解決方案嘗試。我試着將'Fixed Timestep'修改爲0.1,並在一定程度上工作,但不是100%。如果有人有任何解決方案,請幫助。謝謝 –

回答

3

物理碰撞檢測的問題在於,有時物體的速度太高(在這種情況下,由於力量加到剛體上),碰撞不會被檢測到。原因在於你正在執行的代碼是以每秒步數的x次數運行的,所以有時剛體將通過一步到另一步之間的對撞機。假設你有一個每小時100英里的球和一個1英尺寬的牆,每次代碼運行時代碼都會移動一個確定數量的球,因此球的運動是虛擬化的但它不是一個真正的物理運動,所以從一個步驟到另一個步驟可能發生的情況是,球可以從點a移動到b,並且牆在這些點之間,因此碰撞不會被檢測到。

可能的解決方案。

你有一個簡單的解決方案,不會像應該那樣精確,而且會更加準確。

根據硬幣可以獲得的最大速度,解決方案第一將會增加碰撞體的大小,這樣碰撞體就會變得足夠大,從而不會在一幀之間錯過碰撞。

第二個和更難的解決方案將添加一個輔助碰撞檢測,某種安全檢查。例如使用物理光線投射。你可以設置一個光線投射來轉發方向,並確定該物體是否是一次碰撞,如果是,並且一旦該物體不再被射線碰撞,那麼你的碰撞檢測失敗了,這樣你就可以確認並且呼叫碰撞狀態。

我希望對我的英語有幫助和抱歉。如果你沒有深入瞭解它,我可以幫助你使用代碼,但是我需要從你的項目中得到一些代碼。

+0

我已經嘗試增加牆的大小,但它的沒用,我提供了代碼。我只是爲了簡單的測試目的而增加了我的硬幣的力量。 –

1

查看碰撞體的'Is Trigger'是否未選中。 另外,檢查gameObjects是否有碰撞體。

0

我面臨這個問題很多次..

確保你的硬幣的剛體有「是Kinamatic」假的,是Triggger:假的,

,也是「爲觸發」城牆是假。

0

你可以節省每次更新速度和位置,然後自己測試出界,如果硬幣離開有效區域,您可以在最後一個有效位置將其恢復或繪製的碰撞,如果你想