首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重叠Collider2D触发器

重叠Collider2D触发器
EN

Stack Overflow用户
提问于 2015-04-16 10:26:18
回答 1查看 3.2K关注 0票数 2

好吧,让我们谈一谈。

我有两个对撞机,它的目的是确定击球的类型。如果是GoodHitNiceHit (尼斯就像完美的)。

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

使用此代码,我可以确定球是否进入GoodHitNiceHit区域。

代码语言:javascript
复制
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更优先。我可以用名字和价值观交换它们,这样我就能实现我想要的东西,但这并不能真正解决问题。

我能做些什么解决办法或调整吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-16 13:19:28

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

需要记住的是:如果一个对象在内部触发器中,那么它也在更大的触发器内!

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

代码语言:javascript
复制
void OnTriggerStay2D(Collider2D other) {
    if (other.name == "HitNice") {
        hitType = 2;
    } else if(other.name == "HitGood") {
        hitType = 1;
    }
}

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

代码语言:javascript
复制
OnTriggerEnter(HitNice) //hitType is 2
OnTriggerEnter(HitGood) //hitType is now 1!

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

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

代码语言:javascript
复制
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。或者更好的是,将这两种命中类型记录在单独的变量中,然后在进行得分或其他操作时确定它的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29671947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档