【问题标题】:Find both colliders involved in a collision on GameObject with Multiple colliders使用多个对撞机查找与 GameObject 发生碰撞的两个对撞机
【发布时间】:2018-06-02 16:06:38
【问题描述】:

总结如下: 我想从 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);
    }
}

【问题讨论】:

  • 听起来你在两个对象上都有类似的脚本,试图损坏它接触到的另一个触发器。只有其中一个应该应用损坏,另一个应该忽略 OnTriggerEnter2D 回调。如果您发布您目前拥有的代码会有所帮助。
  • 用代码编辑
  • 不确定你到底在问什么。 @SwiftingDuster 的评论是否正确?您只想对一个游戏对象施加伤害?
  • 这是一个场景:对象 A 用触发器接触到对象 B 的对撞机。对象 B 应该是唯一受到伤害的对象。
  • @WhoKnows 然后在 Object b OnTrigger 函数中使其受到伤害。

标签: c# unity3d 2d


【解决方案1】:

综上所述,我想找到两个碰撞器都参与了碰撞

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

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',因为他们有不止一个对撞机,我 只需要碰撞中的那些

碰撞器应该是游戏对象的子对象,并且脚本必须附加到每个子碰撞器,然后这个答案中的内容应该可以工作。


如果出于某种原因您必须在不使碰撞器成为该游戏对象的子对象的情况下执行此操作,则使用布尔变量仅检测碰撞一次

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

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

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

现在,如果调用了OnTriggerEnter2D,并且该boolean 变量的local/this 版本为true,请将其设置为false 以重置它,然后使用@ 获取两个碰撞器987654349@ 变量和来自OnTriggerEnter2D 函数的Collider2D 变量。

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

注意:

YOURSCRIPT 是脚本的名称,OnTriggerEnter2D 函数在其中,并且附加到 Colliders。您必须将其更改为该脚本的名称。

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”,因为它们有多个碰撞器,我只需要碰撞中的碰撞器
  • (编辑后)您的解决方案有效,但是我希望有某种方法可以仅从 OnTriggerEnter2D 事件中找到她所涉及的对撞机。我想我应该接受你所说的。
  • @WhoKnows 不。没有它还有另一种方法,我会编辑它。
【解决方案2】:

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

例如,您有一个具有非触发碰撞器的父对象和一个带有触发碰撞器的子对象。

这样很容易找出碰撞中涉及的对撞机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多