Unityのビルトインフィジックスを使用して、リジッドボディが互いに移動しないようにするにはどうすればよいですか?


8

オブジェクトをドラッグできるゲームを作ろうとしていますが、物理に問題があります。質量が類似しているリジッドボディを使用すると、ドラッグ時に互いに突き抜けて、不要な動きが発生することがあります。こちらがデモです。

Unity 3Dの組み込みの物理演算のみを使用してこれを実行したいと思います。

デモでは、マウスを使用してオブジェクトをクリックしてドラッグできます。円柱はすべてボックスコライダーと質量10000です。また、向きに応じてさまざまな制約があります(どれも回転できず、すべてxまたはyで制約されます)。球体の質量は1、球体コライダー、およびz拘束です。

球と円柱はうまく相互作用します。ただし、円柱を互いにドラッグすると、交差が発生します。これいらない!

円柱の補間は「補間」に設定され、衝突検出は「連続」に設定されています。'DontGoThroughThings'スクリプトをすべてのシリンダーにスローしましたが、何も実行しないようです。リジッドボディの速度の設定に関しては、以下の両方のラインを使用して、基本的に同じ結果が得られました。

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

独自の衝突検出コードを書かなければ、アイデアはありません。簡単な設定や見逃したものはありますか?

コンテキストが説明されたので、より正確な質問を次に示します。「デモのシリンダーが互いに移動しないようにするにはどうすればよいですか?」


シリンダーの質量を減らすことで違いはありますか?
MGB、

いいえ、それは彼らがより簡単に通過するようになると思います。また、質量が球に似ている場合は、球も円柱を通過し始めます。
ジェフ

これをどう思いますか?質量比が大きくなると、物理エンジンの精度が低下します。
MGB 2014

私が試したので、必要に応じて、すべての質量が1に設定されているデモをアップロードできます。
ジェフ

私が考えていることの1つは、速度を変更している方法が原因である可能性があるということです。代わりに力に変えてみるつもりです
ジェフ

回答:


2

あなたのプロジェクト/コードを見ることなく、私はこれを提案したいと思います:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Unityのスコープと物理エンジン内で物理を制限できます。スクリプトを少し動かして、移動するオブジェクトを1つだけロックするようにできますが、これで開始できます。


0

Continuous Dynamic高速で移動するオブジェクトに対して衝突検出を設定します。 オブジェクトが衝突するContinuous静的または動きの遅いオブジェクトに使用されContinuous Dynamicます。こちらをご覧ください

(継続的な衝突検出はコストがかかるため、控えめに使用してください)


各シリンダーをContinuous Dynamicに設定しても、同じ結果が得られます。それはあなたが意味したことですか?
ジェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.