重叠 Collider2D 触发器
Overlapping Collider2D Triggers
好的,让我们开始吧。
我有 2 个碰撞器,它们的目的是确定球的击中类型。如果是 GoodHit 或者 NiceHit (Nice is like Perfect).
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 具有更高的优先级。我可以通过名称和值交换它们,这样我就可以实现我想要的东西,但这并没有真正解决它。
我可以做任何解决方法或调整吗?谢谢!
您有两个重叠的触发器,其中一个位于较大触发器的中间。
这里有一点要记住:如果一个对象在内部触发器中,它也在较大的触发器中!
所以在您的代码中,您使用 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
。因此,当为 HitGood
调用 OnTriggerEnter
时,请检查您是否尚未点击 HitNice
。或者更好的是,将两种命中类型记录在单独的变量中,然后在进行评分或其他操作时解决它是哪种类型的命中。
好的,让我们开始吧。
我有 2 个碰撞器,它们的目的是确定球的击中类型。如果是 GoodHit 或者 NiceHit (Nice is like Perfect).
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 具有更高的优先级。我可以通过名称和值交换它们,这样我就可以实现我想要的东西,但这并没有真正解决它。
我可以做任何解决方法或调整吗?谢谢!
您有两个重叠的触发器,其中一个位于较大触发器的中间。
这里有一点要记住:如果一个对象在内部触发器中,它也在较大的触发器中!
所以在您的代码中,您使用 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
。因此,当为 HitGood
调用 OnTriggerEnter
时,请检查您是否尚未点击 HitNice
。或者更好的是,将两种命中类型记录在单独的变量中,然后在进行评分或其他操作时解决它是哪种类型的命中。