如何检查列表中的所有游戏对象是否满足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,两个游戏对象为绿色。
这是右上角对撞机的检查员:
在此结果中,这是右下对撞机的检查员:
我该如何解决这个问题?
答案 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);