【问题标题】:Make a gameObject observe and compare a value on multiple gameObjects around it?让一个游戏对象观察并比较它周围的多个游戏对象的值?
【发布时间】:2017-08-04 00:13:54
【问题描述】:

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

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

连接到钉子上的 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,并且想知道我是否应该在开始时使用它为每个 peg 生成邻居列表,然后在更新循环中遍历这些并检查它们的值,但这可能会变得昂贵我也不确定。

这是我的第一个 2D 统一项目。我对基于文本的东西没意见,但是即使我已经从里到外阅读了文档,物理还是有点难以理解!任何帮助和建议将不胜感激。

提前致谢!

【问题讨论】:

  • 钉子会移动吗?在您的应用程序开始时,您可以进行一次全面检查以在每个 pegs 脚本中生成邻居列表,这将消除对 OnTriggerStay() 的需要
  • 不。所有的钉子都只是掉落的圆盘反弹的静止物体。哈哈!我刚刚用那个确切的建议编辑了我的问题,可能使用了 Physics2D.OverlapCircleAll (尽管他们并没有太清楚地告诉你如何使用它)?然后在每个 peg 的 update 方法中循环遍历这些值以检查值,只要它的至少一个邻居匹配,就把它变成紫色?
  • 我会说如果你所有的钉子都在同一个容器中,循环遍历容器并检查每个游戏对象之间的距离以生成邻居列表。当球与 OnTriggerEnter 的其中一个钉子发生碰撞时,检查钉子邻居的号码,如果匹配,则将其变为紫色。

标签: c# unity3d


【解决方案1】:

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

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

如果您想更进一步,您可以在球击中时调用更新函数,然后在该函数中更新由[Physics2D.OverlapCircle][1] 返回的所有碰撞器,如果您有超出范围的钉子球与你相撞的那一组会在那里节省一些性能。

【讨论】:

  • 我最终选择了 Physics2D.OverlapCircle 路线。在每个 peg 的生命周期开始时,我会生成它旁边的所有 peg 的列表。然后在更新函数中,每个钉子循环遍历它周围的值以比较值并相应地更改颜色。它工作得非常好!我还发现我的大部分性能问题都与我的掷骰和比较的日志语句有关。我知道,我知道,n00b 错误,但这是我的第一个项目。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多