web-dev-qa-db-ja.com

OnCollisionEnter()がUnity3Dで機能しない

メッシュコライダーを備えたオブジェクトと球体コライダーを備えたプレハブがあります。 2つが衝突した場合、プレハブのインスタンスを破棄してください。

私はスクリプトで次のように書きました:

private void OnCollisionEnter(Collision c)
{
    if (c == target)
        Destroy(transform.gameObject);
    print("something");                   // Doesn't get printed
}

しかし、それは機能していません。両方のオブジェクトでisTriggerを切り替えてみました。

13
Temp Id

OnCollisionEnterが呼び出されないという同じ問題があり、この質問を見つけました。

私にとっての問題は、2Dゲームを作成していたので、答えはOnCollisionEnter2D関数の代わりに。

28
Peter de Rivaz

この表 を見てください

OnCollisionEnterを呼び出す場合は、次のことを確認してください。

(a)両方のオブジェクトにコライダーがアタッチされています。

(b)どのオブジェクトもトリガーコライダーではありません(これにより、OnCollisionEnterではなくOnTrigger関数が発行されます)

(c)オブジェクトの1つ(どのオブジェクトでもかまいません)は、剛体で非運動学的で非静的なオブジェクトです(2番目は剛体である必要はありません)。

(d)計算上の問題により、MeshColliderは他のMesh colliderと衝突するのが難しい場合がありますので、注意して使用してください。

(e)両方のオブジェクトが同じレイヤーにあることを確認します。

example colider configuration

13
Ohad Cohen

それらの1つに非運動リジッドボディが接続されていることを確認してください。 Unityのドキュメントから引用:

2つのコライダー間で衝突が発生し、少なくとも1つにリジッドボディがアタッチされている場合、それらにアタッチされたオブジェクトに3つのコリジョンメッセージが送信されます。これらのイベントはスクリプトで処理でき、組み込みのNVIDIA PhysXエンジンを使用して、または使用せずに、独自の動作を作成できます。

ここから: nity3D MeshCollider

5
lukegravitt

OnTriggerEnter()クラスを使用して、オブジェクトにコライダーをトリガーに設定してみましたか?

それが衝突しているオブジェクトを通知する必要がない場合は、簡単に行うことができます

void OnTriggerEnter(){
Destroy(transform.gameObject);
}

編集:

また、このようにOnCollisionを実行しました

private string hitobject;

void OnCollisionEnter(UnityEngine.Collision hit)
{
    hitobject = hit.gameObject.tag;
    if(hitobject == "Plane")
    {
        isgrounded = true;
    }
}

どのオブジェクトもトリガーではなく、動作するためにridgid bodyを必要としません。

1
Matt Baeriswyl

同様の問題がありました。ボックスコライダーは、衝突オブジェクトほど大きくありませんでした。 xとzの値を2単位に設定すると、問題が修正されました!

1