好吧,让我们谈一谈。
我有两个对撞机,它的目的是确定击球的类型。如果是GoodHit或NiceHit (尼斯就像完美的)。
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更优先。我可以用名字和价值观交换它们,这样我就能实现我想要的东西,但这并不能真正解决问题。
我能做些什么解决办法或调整吗?谢谢!
发布于 2015-04-16 13:19:28
您有两个重叠触发器,其中一个位于较大触发器的中间。
需要记住的是:如果一个对象在内部触发器中,那么它也在更大的触发器内!
因此,在您的代码中,您可以使用OnTriggerStay来确定对象是否在其中一个触发器中。让我们看一看:
void OnTriggerStay2D(Collider2D other) {
if (other.name == "HitNice") {
hitType = 2;
} else if(other.name == "HitGood") {
hitType = 1;
}
}该函数在对象内部的每个触发器中执行一次。因此,如果该函数位于HitNice触发器内,则执行两次。因此,假设联合为每个触发器调用这个函数。可能发生的情况是,它以错误的顺序调用处理程序(伪代码):
OnTriggerEnter(HitNice) //hitType is 2
OnTriggerEnter(HitGood) //hitType is now 1!一致性是从内到外调用对撞机处理程序,导致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。或者更好的是,将这两种命中类型记录在单独的变量中,然后在进行得分或其他操作时确定它的类型。
https://stackoverflow.com/questions/29671947
复制相似问题