好的,让我们进入它。
我有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更优先。我可以通过名称和价值交换它们,这样我就可以实现我想要的东西,但这并没有真正解决它。
我可以做任何变通办法或调整吗?谢谢!
答案 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
。或者甚至更好,在单独的变量中记录两种命中类型,然后在进行评分或其他任何事情时解决它后来的命中类型。