C# 正在检查我的阵列中游戏对象的数量

C# 正在检查我的阵列中游戏对象的数量,c#,unity3d,C#,Unity3d,我需要知道剩下的enemyCans的数量,这样当没有剩余时,我就可以触发我的获胜条件。现在,我的爆炸组件上有一个脚本,可以正常工作,这意味着它可以移除在爆炸一定距离内的任何敌人加农炮。 enemyCans在start()方法中声明并分配以下值: GameObject[] enemyCans; //Before start void Start() { enemyCans = GameObject.FindGameObjectsWithTag("EnemyCannon"); } 然后,我在一个名

我需要知道剩下的
enemyCans
的数量,这样当没有剩余时,我就可以触发我的获胜条件。现在,我的爆炸组件上有一个脚本,可以正常工作,这意味着它可以移除在爆炸一定距离内的任何敌人加农炮。
enemyCans
start()
方法中声明并分配以下值:

GameObject[] enemyCans; //Before start
void Start() {
enemyCans = GameObject.FindGameObjectsWithTag("EnemyCannon");
}
然后,我在一个名为
CannonKiller()
的方法中使用该值,该方法迭代敌方加农炮的变换,以检查爆炸是否靠近它们。我相信这不是最优雅的方法,但上述方法如下所示:

 void CannonKiller()
{
    foreach(var cannon in GameObject.FindGameObjectsWithTag("EnemyCannon").Select(enemyCans => enemyCans.transform).ToArray())
    {
        foreach (var aCan in enemyCans)
        {
            float enemyDis = Vector3.Distance(cannon.position, transform.position);
            if (enemyDis <= 4)
            {
                Destroy(aCan);
            }
        }
    }
}

但我错了。我如何检查他们是否没有剩余的敌人大炮,以便调用我的完成方法

好吧,这个代码可以工作:

void CannonKiller()
    {
        foreach(var cannon in GameObject.FindGameObjectsWithTag("EnemyCannon").Select(enemyCans => enemyCans.transform).ToArray())
        {
            foreach (var aCan in enemyCans)
            {
                float enemyDis = Vector3.Distance(cannon.position, transform.position);
                if (enemyDis <= 4)
                {
                    Destroy(aCan);

                    bool allDestoyed = true;
                    foreach (GameObject o in enemyCans) 
                    {
                        if (o != null && o != aCan) 
                        {
                            allDestoyed = false;
                            break;
                        }
                    }

                    if (allDestoyed) 
                    {
                        // Here you know all are destroyed
                    }
                }
            }
        }
    }
void CannonKiller()
{
foreach(GameObject.FindGameObjectsWithTag(“EnemyCannon”).Select(enemyCans=>enemyCans.transform.ToArray())中的变量cannon)
{
foreach(灌肠罐中的var aCan)
{
float enemyDis=矢量3.距离(cannon.position,transform.position);

如果(enemyDis良好,此代码将起作用:

void CannonKiller()
    {
        foreach(var cannon in GameObject.FindGameObjectsWithTag("EnemyCannon").Select(enemyCans => enemyCans.transform).ToArray())
        {
            foreach (var aCan in enemyCans)
            {
                float enemyDis = Vector3.Distance(cannon.position, transform.position);
                if (enemyDis <= 4)
                {
                    Destroy(aCan);

                    bool allDestoyed = true;
                    foreach (GameObject o in enemyCans) 
                    {
                        if (o != null && o != aCan) 
                        {
                            allDestoyed = false;
                            break;
                        }
                    }

                    if (allDestoyed) 
                    {
                        // Here you know all are destroyed
                    }
                }
            }
        }
    }
void CannonKiller()
{
foreach(GameObject.FindGameObjectsWithTag(“EnemyCannon”).Select(enemyCans=>enemyCans.transform.ToArray())中的变量cannon)
{
foreach(灌肠罐中的var aCan)
{
float enemyDis=矢量3.距离(cannon.position,transform.position);

如果(enemyDis如果可能的话,我建议避免使用太多嵌套的
foreach
循环——尽管Jerry的答案确实有效,但在最坏的情况下,基本上你会有一个O(n3)复杂度的算法,而且读起来有点困难

如果你的所有炮塔上都有对撞机,那么你应该利用物理引擎。如果你使用类似于识别被爆炸击中的炮塔的方法,代码的意图至少会更加清晰

因此,调整
CannonKiller()
以摧毁命中炮塔并确定它们是否全部被摧毁(但可以说是以更简洁的方式),您的方法可能如下所示:

void CannonKiller()
{
    // Grab colliders in vicinity of explosion
    Collider[] hitColliders = Physics.OverlapSphere(transform.position, 4);
    foreach (Collider hitCollider in hitColliders){

        // Only act if collider belongs to an enemy cannon
        if (hitCollider.gameObject.tag == "EnemyCannon"){
            Destroy(hitCollider.gameObject);

            // If there are no non-null references to cannon objects, they're all destroyed
            if (enemyCans.FirstOrDefault(cannon => cannon != null) == null){

                // Execute finishing code, then probably break

            }
        }
    }
}
因为我看到你已经熟悉LINQ了,所以我用它进行了“全部销毁”检查


这可能不是最好的方法,但我认为这是最好的方法,因为它不会严重改变您的实现。(正如Joe所建议的那样,拥有一个manager类是在类之间划分职责的一个好方法,并使您的代码更易于测试/维护——所以一定要考虑这一点,因为它将随着您的项目的增长而扩展得更好。)

如果可能的话,我建议避免使用太多嵌套的
foreach
循环——尽管Jerry的答案确实有效,但在最坏的情况下,基本上是O(n3)复杂度算法,而且读起来有点困难

如果你的所有炮塔上都有对撞机,那么你应该利用物理引擎。如果你使用类似于识别被爆炸击中的炮塔的方法,代码的意图至少会更加清晰

因此,调整
CannonKiller()
以摧毁命中炮塔并确定它们是否全部被摧毁(但可以说是以更简洁的方式),您的方法可能如下所示:

void CannonKiller()
{
    // Grab colliders in vicinity of explosion
    Collider[] hitColliders = Physics.OverlapSphere(transform.position, 4);
    foreach (Collider hitCollider in hitColliders){

        // Only act if collider belongs to an enemy cannon
        if (hitCollider.gameObject.tag == "EnemyCannon"){
            Destroy(hitCollider.gameObject);

            // If there are no non-null references to cannon objects, they're all destroyed
            if (enemyCans.FirstOrDefault(cannon => cannon != null) == null){

                // Execute finishing code, then probably break

            }
        }
    }
}
因为我看到你已经熟悉LINQ了,所以我用它进行了“全部销毁”检查



这可能不是最好的方法,但我认为这是最好的方法,因为它不会严重改变您的实现。(正如Joe所建议的那样,拥有一个manager类是在类之间划分职责的一个好方法,并使您的代码更易于测试/维护——所以一定要考虑这一点,因为它将随着您的项目的增长而扩展得更好。)

你能不能检查一下
Array.Length==0
?你可以数一数被摧毁的大炮的数量,并将其与Enemycan.lengthi Austin进行比较,说清楚一点,你的意思是你不知道获取数组或列表长度的要求是什么?你能解释一下吗?这就是Jacob提到的长度。你不能检查
Array.Length==0
你要数一数被摧毁的大炮的数量,并将其与敌人的大炮进行比较。Lengthi Austin,说得清楚,你的意思是你不知道获取阵列或列表的长度是什么吗?你能解释一下吗?这只是Jacob提到的长度杰兹-我想你和我对这个问题同样感到困惑!:)杰兹-我想你和我对这个问题同样感到困惑!:)我认为值得考虑的是OP的方法是令人难以置信的错误。假设我驾驶一辆装满核废料的卡车,我把这些核废料放在着火的纸板容器中,卡车也着火了,我刚刚撞毁了一家孤儿院,我问“给挡风玻璃雨刷液加满油的最佳方法是什么?”是这样的。在
enemyCans.FirstOrDefault..
条件下,你如何正确定义
cannon
当前每当一门加农炮被击中,它就会触发我的胜利method@AustinMauldin我的错误!它应该检查该行中的等式,而不是
null
的不等式。修复了输入错误,如果有任何错误,请告诉我其他问题。@JoeBlow呃……哈哈,这是一个非常极端的类比。=P我觉得对于Unity/游戏设计的新用户来说,更先进的概念的好处在他们有足够的经验认识到它们之前并不明显——在那之前,我仍然想帮助他们解决眼前的问题,同时仍然提供建议更好的选择。这样,他们就不会被需要在游戏设计方法上进行很大的范式转变所压倒。我想这是非常极端的!)我认为值得考虑的是,OP的方法是令人难以置信的错误。比如说,我开着一辆装满核废料的卡车,我把这些废料放在了f