让游戏对象观察并比较它周围的多个游戏对象的值?

时间:2017-08-03 01:58:34

标签: c# unity3d

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

enter image description here

我已将游戏对象附加到名为Neighbor Checker的每个挂钩上,并附加了圆形碰撞器作为与其邻居重叠的触发器,如下所示:

enter image description here

附着在钉子上的邻居检查器游戏对象设置为圆形对撞机设置为触发器,刚体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,并想知道我是否应该在开始时使用它来为每个peg生成一个邻居列表,然后在更新循环中通过这些并检查它们的值,但这可能会变得昂贵我也不确定。

这是我的第一个2D团结项目。我对基于文本的东西很满意,但即使我已经阅读了内外文档,物理也很难理解!任何帮助和建议将不胜感激。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果你想更进一步,你可以在球击中的那个上调用更新功能,然后在该功能内更新[Physics2D.OverlapCircle][1]返回的所有对手,如果你有钉子的话。球与你碰撞的范围会在那里保存一些表现。