在具有多个碰撞器的游戏对象上,找到参与碰撞的两个碰撞器。

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

仅返回翻译文本:使用代码编辑 - user8943533
不确定您具体在问什么。@SwiftingDuster的评论是否正确?您只想对一个游戏对象应用伤害吗? - Programmer
什么决定了碰撞中谁会受到伤害?如果您能找到那些免受伤害的独特特征,您可以在决定是否应用伤害之前检查该条件。 - Swift
好的,这变得有点复杂了,我不确定每个人都真正理解我想要实现什么。总之,我想找到在碰撞中涉及到的两个碰撞体。 - user8943533
我相当确定那就是我需要的全部,从那里开始其余的都很容易,我可以自己完成。如果您能告诉我如何涉及到碰撞器,那就太好了。我的尝试没有成功,因为游戏对象上有两个或更多的碰撞器。 - user8943533
显示剩余11条评论
2个回答

3

总之,我想找到碰撞中涉及的两个碰撞体

当您的脚本继承自MonoBehaviour时,会声明一个gameObject变量。该变量是指此脚本所附加到的GameObject。您可以使用gameObject变量获取一个GameObject,并从OnTriggerEnter函数中的Collider2D参数中获取另一个GameObject。

void OnTriggerEnter2D(Collider2D collision)
{
    GameObject obj1 = this.gameObject;
    GameObject obj2 = collision.gameObject;

    Debug.Log("Triggered Obj1: :" + obj1.name);
    Debug.Log("Triggered obj2: :" + obj2.name);
}
EDIT:

这些物体对我没用,我需要碰撞体。不,我不能使用 'getcomponent' ,因为它们有多个碰撞器,我只需要在碰撞中的那些。

应该将碰撞器作为游戏对象的子代,并将脚本附加到每个子碰撞器上,然后此答案中的内容就能起作用。


如果由于某些原因必须在不将碰撞器作为游戏对象的子代的情况下完成此操作,则可以使用布尔变量仅检测一次碰撞。

这是帖子中一个答案的修改版。

首先,创建一个名为theOtherCollider的本地Collider2D变量,以存储在调用OnTriggerEnter2D时首次报告的碰撞数据。然后再创建另一个名为detectedBeforeboolean变量,以确定是否之前已调用过OnTriggerEnter2D

当调用OnTriggerEnter2D时,检查该boolean变量的本地/当前版本是否为false。如果它不是true,则这是首次调用OnTriggerEnter2D。使用GetComponent获取另一个脚本,然后将boolean变量设置为true。同时,在其他脚本上对theOtherCollider变量进行初始化,并使用从OnTriggerEnter2D函数中获取的Collider2D值。

现在,如果调用OnTriggerEnter2D,并且该boolean变量的本地/当前版本为true,则将其设置为false以重置它,然后使用theOtherCollider变量和来自OnTriggerEnter2D函数的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<YOURSCRIPT>();
    if (myScript)
    {
        myScript.detectedBefore = true;
        myScript.theOtherCollider = collision;
    }

}

这些对象对我没用,我需要碰撞体。而且,我不能使用“getcomponent”,因为它们有多个碰撞体,我只需要在碰撞中的那些。 - user8943533
你的解决方案是有效的,但我希望能够仅从OnTriggerEnter2D事件中找到所涉及的碰撞器。我想我应该只接受你说的。 - user8943533
@WhoKnows 不用那个方法也有另外一种方式,我会进行编辑。 - Programmer

0
一种实现这个的方法是创建一个子游戏对象来处理其中一个碰撞器。
例如,您有一个具有非触发碰撞器的父对象和一个具有触发碰撞器的子对象。
这样就很容易确定哪些碰撞器参与了碰撞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接