问题描述
我有一个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
}
就这么简单。
您会在游戏代码中到处看到这种模式。
†(该函数中代码的工作方式称为“分离”代码。您只需查找直到找到一些东西,然后分离即可,而不必理会其余部分。 )