2016-11-21 10 views
1

私はRigidbody2Dと2Dのコライダーを私のGameObjectsに付けました。私のオブジェクトの任意の2つの間に衝突があるかどうかをチェックする方法はありますか?私は方法を見つけました:メソッドOnCollisionEnter()、しかし、特定のオブジェクト間の特定の時間に衝突をチェックしたいが、すべての間ではない。それを行う方法はありますか?前もって感謝します!配列内の2DオブジェクトがOnCollisionEnterなしで衝突するかどうかを確認します

+0

OnCollisionEnter()関数内の他のオブジェクトの名前またはタグを確認する必要があります。 https://unity3d.com/de/learn/tutorials/topics/physics/detecting-collisions-oncollisionenter –

+0

しかし、私はオブジェクトの配列を持っていて、特定の時間に私はそれらのいくつかが "foreach"サイクル。それを行う方法はありますか? –

+0

はい、できます。どのようなコライダーが使用していますか? – Programmer

答えて

3

私の オブジェクトのいずれか2つの間に衝突があるかどうかを確認する方法はありますか?

OnCollisionEnterを使用しないで2つの2D Colliderが接触しているかどうかを確認するには、Collider2D.IsTouchingを使用してください。例えば

:配列について

BoxCollider2D myBoxCollider1 = null; 
BoxCollider2D myBoxCollider2 = null; 

if (myBoxCollider1.IsTouching(myBoxCollider2)) 
{ 

} 

、これは少し複雑です。それぞれのループをループして比較しなければなりません。 である必要があります。すでに2つのオブジェクトが比較されているかどうかを確認し、複数のコリジョンの検出を防ぐために比較しません。例えば

、これを行わない場合はループのために、あなたが得る中:

  • オブジェクトAがオブジェクトBに衝突され、その後

  • オブジェクトBがオブジェクトAと衝突しています。

あなたは弱くはありませんこれあなたは、2つのオブジェクト間の衝突を一度検出して報告したいだけです。

Dictionaryは、検出されたオブジェクトを再び検出しないように保存するソリューションでしたが、Dictionaryは同じキーを複数回保持できません。

これを行うにはListKeyValuePairを使用できます。別のループの中にループを作成して、比較を行うにはIsTouchingを使用してください。それぞれBoxCollider2Dを比較する前に、両方がすでにList<KeyValuePair>に存在するかどうかを確認してください。もしそうなら、それを比較しないで比較し、比較してList<KeyValuePair>に加えてください。それらを比較した後、または機能の最後に、リストをクリアします。

//Plug in from the Editor 
public Collider2D[] myBoxColliders = null; 

List<KeyValuePair<Collider2D, Collider2D>> usedCollider = new List<KeyValuePair<Collider2D, Collider2D>>(); 

void checkArrayCollision() 
{ 
    for (int i = 0; i < myBoxColliders.Length; i++) 
    { 
     checkCollision(i, ref usedCollider); 
    } 
    //Reset List for next function call 
    usedCollider.Clear(); 
} 

void checkCollision(int currentIndex, ref List<KeyValuePair<Collider2D, Collider2D>> usedCollider) 
{ 
    for (int i = 0; i < myBoxColliders.Length; i++) 
    { 
     //Make sure that this two Colliders are not the-same 
     if (myBoxColliders[currentIndex] != myBoxColliders[i]) 
     { 
      //Now, make sure we have not checked between this 2 Objects 
      if (!checkedBefore(usedCollider, myBoxColliders[currentIndex], myBoxColliders[i])) 
      { 
       if (myBoxColliders[currentIndex].IsTouching(myBoxColliders[i])) 
       { 
        //FINALLY, COLLISION IS DETECTED HERE, call ArrayCollisionDetection 
        ArrayCollisionDetection(myBoxColliders[currentIndex], myBoxColliders[i]); 
       } 
       //Mark it checked now 
       usedCollider.Add(new KeyValuePair<Collider2D, Collider2D>(myBoxColliders[currentIndex], myBoxColliders[i])); 
      } 
     } 
    } 
} 

bool checkedBefore(List<KeyValuePair<Collider2D, Collider2D>> usedCollider, Collider2D col1, Collider2D col2) 
{ 
    bool checkedBefore = false; 
    for (int i = 0; i < usedCollider.Count; i++) 
    { 
     //Check if key and value exist and vice versa 
     if ((usedCollider[i].Key == col1 && usedCollider[i].Value == col2) || 
       (usedCollider[i].Key == col2 && usedCollider[i].Value == col1)) 
     { 
      checkedBefore = true; 
      break; 
     } 
    } 
    return checkedBefore; 
} 

void ArrayCollisionDetection(Collider2D col1, Collider2D col2) 
{ 
    Debug.Log(col1.name + " is Touching " + col2.name); 
} 

使用

単にmyBoxColliders、アレイ内のコライダーが互いに衝突れているかを確認することcheckArrayCollision();を呼び出します。

void Update() 
{ 
    checkArrayCollision(); 
} 

collsionが検出されるたびに、ArrayCollisionDetection(Collider2D col1, Collider2D col2)関数が呼び出されると、あなたはそのcol1col2パラメータでcolldiongされ、両方のコライダーを受け取ることになります。

注:

あなたはサークル衝突2Dボックス衝突2Dを述べたが、Collider2Dは、それらの両方のクラスのベースであるため、彼らと一緒に動作しますので、この例では、Collider2Dを使用しました。したがって、サークルコライダー2DBox Collider 2DmyBoxCollidersスロットにドラッグすることができます。

2

このオブジェクトと衝突したオブジェクトへのリンクを格納する配列を作成し、OnCollisionEnterにリンクを追加し、OnCollisionExitのリンクを削除することができます。したがって、あるオブジェクトの配列に2番目のオブジェクトの配列が含まれているかどうかをチェックすることができます。この2つのオブジェクトがこの瞬間に衝突します。

関連する問題