7

ボックスコライダーでコインRigidBodyとその周りの壁があります。試行目的で、次のコードをコインに適用しました。

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

ただし、コインが壁を通過することもありますが、速度を 30 から 50 ポイントに上げると、最初のクリックで壁を通過します。私はたくさんグーグルで検索しましたが、DontGoThroughThings スクリプト以外は何も得られませんでした。これは私にとっては機能しないか、使用方法が本当にわかりません。

私は常にコインに継続的なダイナミクスを追加し、壁に継続的な衝突検出を追加しましたが、それでも機能しません。

4

4 に答える 4

7

物理衝突検出の問題は、オブジェクトの速度が速すぎる場合 (この場合は、剛体に力が加えられた結果)、衝突が検出されないことがあります。その理由は、実行しているコードが 1 秒あたり x のステップ数で実行されているため、リジッドボディが 1 つのステップと別のステップの間でコライダーを通過することがあるためです。時速 100 マイルのボールと、幅 1 フィートの壁があるとします。コードは、物理学に従ってコードが実行されるたびに、決められた量のフィートだけボールを動かします。したがって、ボールの動きは仮想化されます。しかし、これは実際の物理的な動きではないため、あるステップから別のステップへとボールが点 a から b に移動する可能性があり、壁がそれらの点の間にあり、結果として衝突が検出されないことがあります。

可能な解決策。

本来あるべきほど正確ではない単純な解決策と、完全に正確になる難しい解決策があります。

最初の解決策は、コインが得られる最大速度に応じてコライダーのサイズを大きくすることです。これにより、フレーム間で衝突が見逃されないように、コライダーが十分に大きくなります。

2番目の難しい解決策は、衝突検出に補助機能を追加することです。これは、ある種のセキュリティチェックです。たとえば、物理的なレイキャストを使用します。レイキャストを前方に設定し、そのオブジェクトが差し迫った衝突であるかどうかを判断できます。そうであれば、オブジェクトがレイキャストによって衝突されなくなったら、衝突検出が失敗したため、Auxiliar でそれを確認して呼び出すことができます。衝突状態。

役に立てば幸いです。私の英語については申し訳ありません。あまり理解していない場合は、コードを手伝うことができますが、プロジェクトからのコードが必要になります。

于 2014-01-30T20:14:06.950 に答える
1

コライダーの「Is Trigger」がチェックされていないかどうかを確認します。また、gameObjects にコライダーがあるかどうかを確認します。

于 2014-02-05T04:00:52.290 に答える
0

私は何度もこの問題に直面しました..

コインの Rigidbody に「Is Kinamatic」False、Is Triggger:false、

また、壁の Is Trigger は False です。

于 2014-09-11T12:00:03.007 に答える
0

更新ごとに速度と位置を保存してから、範囲外をテストできます。コインが有効な領域を離れた場合は、最後の有効な位置に復元するか、必要に応じて衝突を自分でプロットできます

于 2015-06-22T21:20:12.137 に答える