【问题标题】:If all gameObjects in list meet a condition如果列表中的所有游戏对象都满足条件
【发布时间】:2017-09-17 11:08:22
【问题描述】:

如何在 Unity 中检查列表中的所有游戏对象是否满足特定条件?我有 9 个具有相同脚本的对撞机。他们都有一个列表,通过 我试过这段代码,但它返回奇怪的结果。

void Update()
{
    for (int i = 0; i < ChildTiles.Count; i++) 
    {
        if (ChildTiles [i].GetComponent<SpriteRenderer> ().color == Green) 
        {
            _greenComplete = true;
        } 
        else 
        {
            _greenComplete = false;
        }
        //Debug.Log (gameObject + "ChildTiles[i]" + ChildTiles [i]);
    }
    Debug.Log (gameObject + "Green Complete " + _greenComplete);
}

奇怪的是,右上角的碰撞器返回 True,两个游戏对象为绿色,而右下角的碰撞器返回 false,两个游戏对象为绿色。

这是结果中右上方碰撞器的检查器:

这是结果中右下角碰撞器的检查器:

我该如何解决这个问题?

【问题讨论】:

  • 另一个好问题。谢谢。

标签: c# unity2d


【解决方案1】:

问题来自您的for 循环。仔细看看你写的东西。对于列表中的每个元素,您正在检查其 SpriteRenderer 组件的颜色是否为绿色。如果是这种情况,请将 _greenComplete 设置为 true,否则将其设置为 false。

现在让我们看看您的两个列表,并尝试在每个列表上使用此算法。对于第一个列表:

  • 第一个元素是黄色。 _greenComplete 设置为 false。
  • 第二个元素是绿色。 _greenComplete 设置为 true。
  • 第三个元素是红色。 _greenComplete 设置为 false。
  • 第四个元素是绿色。 _greenComplete 设置为 true。

你知道问题出在哪里了吗?您没有定义您的列表是否包含绿色元素。如果最后分析的元素为绿色,您将连续定义。正如我们刚刚看到的第一个列表,最后,最终结果为真,因为列表的最后一个元素是绿色的。查看您的第二个列表:

  • 第一个元素是绿色。 _greenComplete 设置为 true。
  • 第二个元素是绿色。 _greenComplete 设置为 true。
  • 第三个元素是红色。 _greenComplete 设置为 false。
  • 第四个元素是黄色。 _greenComplete 设置为 false。

您的列表包含两个绿色元素,但最后分析的元素不是绿色,导致您最后得到的值是错误的。

要修复您的代码并获得您想要的真正答案,您宁愿使用while 循环,一旦您在列表中发现一个不同的绿色元素而不是绿色,该循环就会停止(您开始假设每个元素是绿色的,确实是绿色的,看看是不是这样):

void Update()
{
    int i = 0;
    _greenComplete = true;

    while(i < ChildTiles.Count && _greenComplete) 
    {
        if (ChildTiles [i].GetComponent<SpriteRenderer> ().color != Green) 
        {
            _greenComplete = false;
        } 

        i++;
    }

    Debug.Log (gameObject + "Green Complete " + _greenComplete);
}

你也可以使用 LINQ 来解决这个问题:

_greenComplete  = ChildTiles.All (c => c.GetComponent<SpriteRenderer> ().color == Green);

【讨论】:

  • 即使列表中只有一个绿色对象,它也会返回 True。
  • 好的,我现在正在使用此代码:pastebin.com/0u2EH6iT。它等到旋转完成,然后检查是否有 4 种颜色匹配。现在的问题是,当每种颜色都匹配时,只有当您单击检查颜色是否匹配的按钮时才会返回 True。这是为什么?这是一个更好地理解它的 gif:gyazo.com/a2a5c8a5051e937338807fb5ecfaa4ec
  • @J.K.Harthoorn 啊,所以你希望每种颜色都匹配,我没有从你的问题中理解它。我当时就此事编辑了我的答案。对于您的其他问题,仅使用这段代码很难知道。您可能应该在每次旋转方块后都进行测试。
  • 但这就是我已经在做的事情,因为它等待 1 秒而旋转需要 0.5 秒。问题是它只检查最后点击的对撞机。
  • ChildTiles 究竟包含什么?
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多