在具有多个碰撞器的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); } }
总结一下,我想找到碰撞中的两个碰撞器
当您的脚本从MonoBehaviour
inheritance时,会声明一个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
。
这可能令人困惑,但通过查看代码,它更容易理解。
注意:
YOURSCRIPT
是OnTriggerEnter2D
函数所在的脚本的名称,它附加到碰撞器上。 您必须将其更改为该脚本的名称。
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; } }
实现这一目标的一种方法是创建一个子游戏对象来处理其中一个碰撞器。
因此,例如,您有一个具有非触发器对撞机的父对象,以及一个具有触发器对撞机的子对象。
通过这种方式,很容易弄清楚碰撞中的碰撞器。