在具有多个碰撞器的GameObject上找到与碰撞有关的两个碰撞器

总结以下内容:我想从OnTriggerEnter2D事件中找到碰撞中涉及的两个碰撞器。 我怎样才能做到这一点?

我有两个游戏对象。 两者都有对撞机和扳机。

在对象A上,它被触发器包围。 在对象B上,触发器仅包围某个部分。

当对象A的触发器触及对象B的任何对撞机(触发与否)时:我希望对象B失去健康。 反之亦然。

然而,当对象A的触发器接触对象B的对撞机(而不是触发器)时,两个对象都会失去健康。

我在控制台中得到了这个

Object A hit Object B Object B hit Object A 

我得出结论,对象A的触发器在对象B上调用Ontrigger2d事件。

我认为解决这个问题的最佳方法是找到哪个碰撞器’找到’碰撞,并依赖于此:忽略碰撞..

如何找到碰撞中发现的触发器?

[也发布在Unity论坛上]

编辑:代码

 private void OnTriggerEnter2D(Collider2D collision) { Consumeable con = collision.GetComponentInParent(); if (con != null && con.gameObject != gameObject) { Debug.Log(gameObject.name + " hit " + con.gameObject.name); con.Damage(1); } } 

总结一下,我想找到碰撞中的两个碰撞器

当您的脚本从MonoBehaviourinheritance时,会声明一个gameObject变量。 此变量引用此脚本附加到的GameObject。 您可以使用该gameObject变量获取一个gameObject并使用OnTriggerEnter函数中的Collider2D参数获取OnTriggerEnter

 void OnTriggerEnter2D(Collider2D collision) { GameObject obj1 = this.gameObject; GameObject obj2 = collision.gameObject; Debug.Log("Triggered Obj1: :" + obj1.name); Debug.Log("Triggered obj2: :" + obj2.name); } 

编辑

这些东西对我来说没用。 我需要对手。 不,我不能使用’getcomponent’,因为它们有多个对撞机,我只需要碰撞中的那些

碰撞器应该成为GameObject的子代,并且脚本必须附加到每个子对撞机上,然后这个答案应该有效。


如果某种原因你必须这样做而不使该游戏对象的碰撞器是子对象,那么使用布尔变量来仅检测碰撞一次

这是对这篇文章的回答的修改。

有一个名为theOtherCollider的本地Collider2D变量来存储在调用OnTriggerEnter2D时首先报告的冲突数据,然后有另一个名为detectedBefore boolean变量来确定之前是否已调用OnTriggerEnter2D

调用OnTriggerEnter2D ,检查该boolean变量的本地/此版本是否为false 。 如果不是true那么这是第一次OnTriggerEnter2D 。 使用GetComponent获取另一个脚本,然后将另一个脚本的boolean变量设置为true 。 同时,还使用OnTriggerEnter2D函数中的Collider2D值初始化另一个脚本上的theOtherCollider变量。

现在,如果OnTriggerEnter2D并且该boolean变量的本地/此版本为true ,则将其设置为false以重置它,然后从OnTriggerEnter2D函数获取具有theOtherCollider变量和Collider2D变量的两个碰撞Collider2D

这可能令人困惑,但通过查看代码,它更容易理解。

注意:

YOURSCRIPTOnTriggerEnter2D函数所在的脚本的名称,它附加到碰撞器上。 您必须将其更改为该脚本的名称。

 public bool detectedBefore = false; public Collider2D theOtherCollider; void OnTriggerEnter2D(Collider2D collision) { //Get both colliders then exit if we have already ran this code below if (detectedBefore) { //Reset detectedBefore = false; //Get both Colliders once below Collider2D col1 = theOtherCollider; Collider2D col2 = collision; Debug.Log("Triggered Obj1: " + col1.name); Debug.Log("Triggered obj2: " + col2.name); return; //EXIT the function } //Set the other detectedBefore variable to true then set get the first Collider YOURSCRIPT myScript = collision.gameObject.GetComponent(); if (myScript) { myScript.detectedBefore = true; myScript.theOtherCollider = collision; } } 

实现这一目标的一种方法是创建一个子游戏对象来处理其中一个碰撞器。

因此,例如,您有一个具有非触发器对撞机的父对象,以及一个具有触发器对撞机的子对象。

通过这种方式,很容易弄清楚碰撞中的碰撞器。