【发布时间】: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 的其中一个钉子发生碰撞时,检查钉子邻居的号码,如果匹配,则将其变为紫色。