如果列表中的所有游戏对象都满足条件

时间:2017-09-17 11:08:23

标签: c# unity2d

如何检查列表中的所有游戏对象是否满足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,两个游戏对象为绿色。

https://i.gyazo.com/cb3352585720e2e630315a268a436fb6.png

这是右上角对撞机的检查员:

https://i.gyazo.com/aa210144daf5fb663292fff1fa198b27.png

在此结果中,这是右下对撞机的检查员:

https://i.gyazo.com/97ad742e723a31dddea7ab43eaf8e31a.png

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题来自您的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);