假设我有一个永远不会动的钉子板,并且从顶部以Plinko风格放下了光盘。当碟片掉落并撞到钉子时,它们会产生一个从1-6的随机值,该值会显示在钉子上。现在,我希望每个具有匹配值的直接邻居的桩都变成紫色,如下所示:

c# - 让gameObject观察并比较周围的多个gameObjects的值?-LMLPHP

我已经将一个游戏对象附加到每个称为Neighbor Checker的钉子上,并附加了圆形对撞机作为与邻居重叠的触发器,如下所示:

c# - 让gameObject观察并比较周围的多个gameObjects的值?-LMLPHP

连接到桩的Neighbor Checker游戏对象是通过设置圆形对撞机作为触发器,将刚体2d设置为运动学,离散碰撞检测和永不睡眠的方式设置的(这种连续检查似乎使值检查更加准确,但是会降低性能,使光盘掉落并弹起。

我遇到的主要问题是准确性:有时3或4个钉子都是相同值的邻居,而一个钉子仍然是绿色的。

我在邻居检查器脚本中使用OnTriggerStay2D(Collider2D邻居)监视钉子及其邻居的值,并在值匹配时更改其颜色,如下所示:

 void OnTriggerStay2D (Collider2D neighbor) {

         if (neighbor.gameObject.tag == "NeighborChecker") {
             textMesh = transform.parent.gameObject.GetComponentInChildren<TextMesh>();
             neighborTextMesh = neighbor.transform.parent.gameObject.GetComponentInChildren<TextMesh>();
             if (textMesh.text == neighborTextMesh.text) { // Make it purple
                 transform.parent.GetComponent<SpriteRenderer>().color = new Color(.5f,0f, 0.5f);
             }
             else { // Change it back to the original green starting color
                 transform.parent.GetComponent<SpriteRenderer>().color = startingColor;
             }
         }
     }


关于如何提高准确性和效率有什么建议吗?我要彻底解决这个问题吗?我已经在Unity文档中看到了这一点:Physics2D.OverlapCircleAll,想知道我是否应该一开始就使用它为每个桩生成邻居列表,然后在更新循环中遍历这些桩并检查其值,但这可能会变得昂贵也是,所以我不确定。

这是我的第一个2D统一项目。我对基于文本的东西没什么好感,但是即使我从里到外都阅读了文档,物理学也很难理解!任何帮助和建议,将不胜感激。

提前致谢!

最佳答案

如果要最大程度地提高性能,则只应在发生更改时才更新钉子。您可以将所有钉子存储在一个数组中(或者如果您想在运行时添加更多钉子一个列表),然后在每个Neighbor上调用一个函数来告诉它检查周围环境,这将减少时间您正在对邻居进行大量检查,从而导致代码性能更好。

如果要在自定义函数中使用Physics2D.OverlapCircle,则可以检查其他对撞机是否与它重叠。因此,一旦球记录到碰撞,您将使用for循环遍历数组,并在每个球上调用update函数。应该注意的是,如果您想在球与圆碰撞之前更新颜色,则还需要在游戏开始时执行此循环。

如果您想更进一步,可以在球击中的那个上调用update函数,然后在该函数中更新[Physics2D.OverlapCircle][1]返回的所有对撞机(如果您的钉子不在组的范围内)球与您发生碰撞会节省一些性能。

08-27 02:21