重叠Collider2D触发器

时间:2015-04-16 10:26:19

标签: unity3d

好的,让我们进入它。

我有2个碰撞器,其目的是确定球的击中类型。如果它是 GoodHit NiceHit (Nice就像完美)。

GoodHit collider2d的面积比 NiceHit 大得多。 另一方面, NiceHit 与其中心的 GoodHit 的一部分重叠。

使用此代码我可以确定球是否进入 GoodHit 区域和 NiceHit

void OnTriggerEnter2D(Collider2D other) {
        if (other.name == "HitNice") {
            hitType = 2;
        } else if(other.name == "HitGood") {
            hitType = 1;
        }
    }

void OnTriggerStay2D(Collider2D other) {
        if (other.name == "HitNice") {
            hitType = 2;
        } else if(other.name == "HitGood") {
            hitType = 1;
        }
    }

void OnTriggerExit2D(Collider2D other) {
            hitType = 0;
    }

问题是它没有触发NiceHit,并且无论球是否在NiceHit区域,hitType仍然是1。

我首先创建了Goodhit对象,从某种意义上说它比NiceHit更优先。我可以通过名称和价值交换它们,这样我就可以实现我想要的东西,但这并没有真正解决它。

我可以做任何变通办法或调整吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你有两个重叠的触发器,其中一个触发器位于较大的触发器中间。

这里要记住:如果一个物体在内部触发器内,它也在更大的触发器内!

因此,在您的代码中,您使用OnTriggerStay来确定对象是否在其中一个触发器中。我们来看看:

void OnTriggerStay2D(Collider2D other) {
    if (other.name == "HitNice") {
        hitType = 2;
    } else if(other.name == "HitGood") {
        hitType = 1;
    }
}

对象所在的每个触发器执行一次此函数。因此,如果该函数位于HitNice触发器内,则执行两次。所以我们假设Unity为每个触发器调用此函数。可能发生的是它正在以错误的顺序调用处理程序(伪代码):

OnTriggerEnter(HitNice) //hitType is 2
OnTriggerEnter(HitGood) //hitType is now 1!

Unity从内到外调用对撞机处理程序,导致HitGood触发器的结果始终覆盖HitNice值。我不确定这是否有效,但看看你的代码,它完全有可能导致它无法正常工作。

现在,我不能肯定地说这个,但我认为只使用你的OnTriggerEnter处理程序就足够了。它只会在进入对撞机而不是停留时触发hitType检测。由于对象必须在进入内部触发器之前输入外部触发器,这意味着它应始终以正确的顺序进行评估。在这种情况下,您的代码可能按原样运行,但我会说您的逻辑应该是这样的:

void OnTriggerEnter2D(Collider2D other) {
    if(other.name == "HitNice") {
        hitType = 2;
    } else if(other.name == "HitGood" && hitType != 2) {
        hitType = 1;
    }
}

这种方法唯一需要注意的是,您需要手动重置hitType的值。不确定你的游戏究竟是如何工作的,但这应该让你知道如何处理这个问题。您的HitNice始终覆盖HitGood。因此,当为OnTriggerEnter调用HitGood时,请检查您是否尚未点击HitNice。或者甚至更好,在单独的变量中记录两种命中类型,然后在进行评分或其他任何事情时解决它后来的命中类型。