私はRigidbody2Dと2Dのコライダーを私のGameObjectsに付けました。私のオブジェクトの任意の2つの間に衝突があるかどうかをチェックする方法はありますか?私は方法を見つけました:メソッドOnCollisionEnter()、しかし、特定のオブジェクト間の特定の時間に衝突をチェックしたいが、すべての間ではない。それを行う方法はありますか?前もって感謝します!配列内の2DオブジェクトがOnCollisionEnterなしで衝突するかどうかを確認します
答えて
私の オブジェクトのいずれか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
は同じキーを複数回保持できません。
これを行うにはList
とKeyValuePair
を使用できます。別のループの中にループを作成して、比較を行うには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)
関数が呼び出されると、あなたはそのcol1
とcol2
パラメータでcolldiongされ、両方のコライダーを受け取ることになります。
注:
あなたはサークル衝突2Dとボックス衝突2Dを述べたが、Collider2Dは、それらの両方のクラスのベースであるため、彼らと一緒に動作しますので、この例では、Collider2D
を使用しました。したがって、サークルコライダー2DとBox Collider 2DをmyBoxColliders
スロットにドラッグすることができます。
このオブジェクトと衝突したオブジェクトへのリンクを格納する配列を作成し、OnCollisionEnter
にリンクを追加し、OnCollisionExit
のリンクを削除することができます。したがって、あるオブジェクトの配列に2番目のオブジェクトの配列が含まれているかどうかをチェックすることができます。この2つのオブジェクトがこの瞬間に衝突します。
- 1. オブジェクトの衝突をリセットして、OnCollisionEnterが再びトリガーする
- 2. ユニティ。オブジェクトが関数内で別のものと衝突しているかどうか確認します。
- 3. オブジェクトが配列内のすべてのオブジェクトに衝突するかどうかを確認するにはどうすればいいですか(ピクチャボックス)
- 4. 2D移動オブジェクトの衝突
- 5. 衝突検出をセットアップしてから2Dゲームで衝突を処理する
- 6. オブジェクトが配列内にあるかどうかを確認する方法
- 7. どのように衝突を検出するが、box2dで衝突しない?
- 8. javascript - 配列がnullかどうかを確認しますか?
- 9. 配列内のオブジェクトのプロパティが存在するかどうかを確認します。
- 10. オブジェクトの配列内のkeyの値がiOSと同じかどうかを確認しますか?
- 11. 配列に値が存在するかどうかを確認し、配列に値があるかどうかを確認します。
- 12. レコードが(配列の配列から)Railsに存在しないかどうかを確認しますか?
- 13. 2d配列がサンプル配列と一致するかどうかを確認する
- 14. インスペクタの配列が空であるかどうかを確認します
- 15. 配列内のオブジェクトがnullか空であるかどうかを確認してください。
- 16. 円弧内の2D衝突検出
- 17. FlashオブジェクトにJavaScript内のメソッドがあるかどうかを確認します。
- 18. オブジェクトが行列であるかどうかを確認します
- 19. オブジェクトの配列の配列が別の配列であるが、長さが異なるかどうかを確認します。
- 20. 値が配列内にあるかどうかをExcel VBAで確認する
- 21. 2つのオブジェクト配列を比較し、共通の要素があるかどうかを確認します
- 22. 衝突2DでProcessingjsゲーム
- 23. 配列に値が存在するかどうかを確認します。
- 24. 配列が別の配列のサブセットであるかどうかを確認しますか? (C++)
- 25. 配列の配列に内部配列内の値があるかどうかを確認するにはどうすればよいですか?
- 26. 配列内に重複するインデックス値が存在するかどうかを確認しますか?
- 27. のJava 2Dの衝突
- 28. 衝突検出が確実に1回の衝突でトリガーされるようにします
- 29. Smarty:変数が配列にあるかどうかを確認します
- 30. 衝突なしでランダムに配列を塗りつぶすアルゴリズム
OnCollisionEnter()関数内の他のオブジェクトの名前またはタグを確認する必要があります。 https://unity3d.com/de/learn/tutorials/topics/physics/detecting-collisions-oncollisionenter –
しかし、私はオブジェクトの配列を持っていて、特定の時間に私はそれらのいくつかが "foreach"サイクル。それを行う方法はありますか? –
はい、できます。どのようなコライダーが使用していますか? – Programmer