2017-10-31 9 views
0

天びんの動作を再現する2つのピストンをシミュレートします。私は、OnCollisionStayが呼び出されたときに、スプリングジョイントと逆ウェイトを適用することでこれを行います。これは私のピストンと硬骨と関節です。両方とも全く同じです。OnCollisionStayに触れるリジッドボディが呼び出されなくなりました(Unity3D)

two pistons

これは私のSpringForceTransmisor.csコードです: UnityEngineを使用して、

public Rigidbody InverseJoint; 

private void OnCollisionEnter(Collision collision) { 
    Debug.Log("Enter"); 
} 

private void OnCollisionExit(Collision collision) { 
    Debug.Log("Exit"); 
} 

private void OnCollisionStay(Collision collision) { 
    InverseJoint.AddForce(-(collision.rigidbody.mass * Physics.gravity)); 
    Debug.Log("Stay"); 
} 

そしてthis is a video何が起こっているのか。

したがって、OnCollisionStay()はOnCollisionExit()が一度も呼び出されていなくても呼び出しを停止します。これはどのように可能ですか?私はいつもOnCollisionStay()がOnCollisionEnterフレームとOnCollisionExitフレームからのすべてのフレームと呼ばれると考えました。

ここで何が起こっているのか誰かが分かりますか?

+0

これは、衝突検出モードを[連続]に変更した場合でも発生しますか? – ryeMoss

答えて

0

"Enter"が登録されている部分をビデオに含めておけば、あなたの質問に対する答えは明らかになります。

ここで何が起こっているのかを説明するために、traingulated sphereの例を示します。これは、どのように見えるかです(いくつかの三角形は意図的に見えなくなりました)。

(primitive sphere mesh in unity)

それは本質的にすべてが三角形を形成するポイントの集まりです、それが中空であることに留意してください。今、これはメッシュコライダーコンポーネントのメッシュです。他のコライダーがこのsphere_mesh_colliderとやりとりする場合、それを検出する唯一の方法は、交差を持つ2つのコライダーの三角形を調べることです。これは、三角形の内側に覆われていない他の領域はチェックされないことを意味します。言い換えれば、私の球体の体積は決して衝突を検出しません(また、衝突滞在を呼び出すこともありませんが、衝突者は出ていないので、出口も呼び出さない)。

私はあなたのケースで起こっていると思っていますが、私は衝突者が相互作用する(Enter)と離れる(Exit)というプロセス全体を見ることができないので、私は確かに言えません。

編集:エディタウィンドウで1つのワイヤフレーム(または網掛けされたワイヤフレーム)を有効にすると、これを簡単に確認できます。

1

OnCollisionStay上の文書によると、それは言う:

OnCollisionStayが剛体/コライダーに触れている剛体すべてのコライダー/ のために1フレームに1回と呼ばれています。

残念ながら、これはではなく、が真です。一部のケースではOnCollisionStay関数が何回か呼び出され、呼び出しが停止されます。 これは長年にわたって修正されていない長いバグか、ドキュメントが間違っています。人々へ

私のいつものアドバイスはOnCollisionStay機能を放棄することであり、単にOnCollisionExit機能でfalseに設定し、その後OnCollisionEnter機能でtrueにブール変数を設定します。その後、Update関数のブール変数をチェックすることにより、関数としてUpdate関数を使用することができます。

public Rigidbody InverseJoint; 

bool collisionStay = false; 
Collision collision = null; 

private void OnCollisionEnter(Collision collision) 
{ 
    Debug.Log("Enter"); 
    collisionStay = true; 
    this.collision = collision; 
} 

private void OnCollisionExit(Collision collision) 
{ 
    Debug.Log("Exit"); 
    collisionStay = false; 
    this.collision = collision; 
} 

void Update() 
{ 
    if (collisionStay) 
    { 
     InverseJoint.AddForce(-(collision.rigidbody.mass * Physics.gravity)); 
     Debug.Log("Stay"); 
    } 
} 
+0

私は同意します。 FixedUpdateを使用する方が良いでしょうか? – Maximetinu

関連する問題