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

时间:2018-06-02 16:06:38

标签: c# unity3d 2d

总结以下内容: 我想从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<Consumable>();

    if (con != null && con.gameObject != gameObject)
    {
        Debug.Log(gameObject.name + " hit " + con.gameObject.name);

        con.Damage(1);
    }
}

2 个答案:

答案 0 :(得分:2)

  

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

当您的脚本继承自gameObject时,会声明MonoBehaviour变量。此变量引用此脚本附加到的GameObject。您可以使用gameObject变量获取一个GameObject,并使用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的孩子,并且必须将脚本附加到每个子对撞机,然后这个答案应该有效。

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

这是对this帖子的答案的修改。

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

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

现在,如果调用了OnTriggerEnter2D且该boolean变量的本地/此版本为true,请将其设置为false为重置它,然后获取theOtherCollider变量的碰撞器和Collider2D函数的OnTriggerEnter2D变量。

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

注意:

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<YOURSCRIPT>();
    if (myScript)
    {
        myScript.detectedBefore = true;
        myScript.theOtherCollider = collision;
    }

}

答案 1 :(得分:0)

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

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

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