Unity检查数组中的2D对象是否在没有OnCollisionEnter的情况下发生冲突

时间:2016-11-21 15:02:21

标签: c# unity3d unity5

我将Rigidbody2D和2D碰撞器连接到我的GameObjects。有没有办法检查我的任何两个物体之间是否有碰撞?我找到了一种方法:方法OnCollisionEnter(),但我想在特定对象之间的特定时间内检查碰撞,但不是在所有对象之间。有没有办法做到这一点?提前谢谢!

2 个答案:

答案 0 :(得分:4)

  

有没有办法检查我的任何两个人之间是否有碰撞   对象

要检查两个2D碰撞者是否在没有OnCollisionEnter的情况下触碰/碰撞,请使用Collider2D.IsTouching

例如:

BoxCollider2D myBoxCollider1 = null;
BoxCollider2D myBoxCollider2 = null;

if (myBoxCollider1.IsTouching(myBoxCollider2))
{

}

对于数组,这有点复杂。你必须循环并比较每一个与另一个。你必须检查是否已经比较了两个obejct,并且不再比较它们以防止多个collison检测。

例如,在for循环中,如果你不这样做,你将得到:

  • 对象A与对象B碰撞

然后

  • 对象B与对象A发生冲突。

你不想要这个。您只想检测并报告两个对象之间的collsion。

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); } 。完成比较后或功能结束后,清除列表。

checkArrayCollision();

<强>用法

只需致电myBoxColliders,检查void Update() { checkArrayCollision(); } 阵列中的哪些碰撞器相互碰撞。

ArrayCollisionDetection(Collider2D col1, Collider2D col2)

每次检测到collsion时,都会调用col1函数,您将收到col2Collider2D参数中colldiong的两个碰撞器。

注意:

您提到了 Circle Collider 2D Box Collider 2D ,但此示例使用了myBoxColliders,因为 Collider2D 是类的基础因此,他们都将与他们合作。因此,您可以将 Circle Collider 2D Box Collider 2D 拖到 }).success(function(data){ console.log(data.events) $scope.events = data.events $scope.$apply(); // <----- try to add this line $location.path('/profile'); 位置。

答案 1 :(得分:2)

您可以创建一个数组,用于存储与此对象冲突的对象的链接,然后只需添加OnCollisionEnter中的链接并删除OnCollisionExit中的链接。因此,您将能够检查一个对象的数组是否包含指向第二个对象的链接(如果是) - 这两个对象此时会发生冲突。