如何检查数组中的所有对象是否都满足要求?

问题描述

我有一个Target类的对象数组,并且我有一个for循环来检查每个对象上的语句。我需要做的是检查是否所有目标脚本都被击落,这可以通过检查布尔属性hasShotDown的值来完成。然后,如果数组中的所有Target对象都为hasShotDown返回true,则游戏应通过停止timer对象来结束。

    public Timer timer;

public Target[] targets;

private void Start() {
    targets = gameObject.GetComponents<Target>();
}

private void OnTriggerEnter(Collider other) {

    if (other.gameObject.layer == 9) {
        foreach (Target obj in targets) {
            if (obj.hasShotDown) {
                timer.StopTimer();
                Debug.Log("Stopped Timer and Ended game");
            }
        }
    }
}

计时器是对另一个类的引用,该类可以停止,启动和显示计时器。目标是另一个类,它具有hasShotDown。感谢所有帮助,如果需要更多信息,请告诉我。

解决方法

if (targets.All(obj => obj.hasShotDown)) // or .Any to test for ... "any"
{
    timer.StopTimer();
    Debug.Log("Stopped Timer and Ended game");
}
,

使用常规的foreach循环执行此操作的另一种方法是创建一个变量,以指示所有对象已被击落,并以true值开始,然后如果找到尚未被击落的任何物体,请将其设置为false

private void OnTriggerEnter(Collider other) 
{
    if (other.gameObject.layer == 9) 
    {
        bool allObjectsShotDown = true;

        foreach (Target obj in targets) 
        {
            if (!obj.hasShotDown) 
            {
                allObjectsShotDown = false;
                break;
            }
        }

        if (allObjectsShotDown)
        {
            timer.StopTimer();
            Debug.Log("Stopped Timer and Ended game");
        }
    }
}
,

您经常这样做...

public bool AreAnyRemaining()
{
  foreach .. of your targets
     {
     if NOT shotdown,return TRUE
     }
  return FALSE
}

请注意,如果其中一个呼叫被 NOT 击落,则此调用有效地返回TRUE。

您可以轻松地使用它....

OnTriggerEnter ..
   if ( AreAnyRemaining() )
   {
      Debug.Log("play on!");
   }
   else
   {
      THEY ARE ALL SHOT DOWN - end game,etc
   }

就这么简单。

您会在游戏代码中到处看到这种模式。


(该函数中代码的工作方式称为“分离”代码。您只需查找直到找到一些东西,然后分离即可,而不必理会其余部分。 )