在foreach循环中为空游戏对象

时间:2017-03-18 19:21:28

标签: c# unity3d foreach nullreferenceexception gameobject

我正在尝试遍历GameObjects列表并找到第一个在层次结构中不活动的GameObject并返回该GameObject。

我遇到的问题是我的foreach声明继续在"敌人"

上返回null

"敌人"在下面的这个陈述中是问题所在

"在pizzaEnemyList"

中的GameObject敌人

我在列表中有一个Gameobject。包含在下面的图片中

private List<GameObject> pizzaEnemyList = new List<GameObject> ();

private GameObject FetchPizzaEnemy()
{
    GameObject pizzaEnemy = null;
    int count = 0;

    foreach (GameObject enemy in pizzaEnemyList)
    {
        if (enemy.activeInHierarchy == false)
        {
            pizzaEnemy = pizzaEnemyList [count];

            pizzaEnemyList.Remove (enemy);


            return pizzaEnemy;
        }
        count += 1;
    }

    return pizzaEnemy;
}

//我正在使用的功能将敌人添加到列表中。

public void DeactivateAndStoreEnemy(GameObject enemy)
{
    //decativates the enemy
    enemy.SetActive(false);



    //Store the enemy into the correct list
    if (enemy.name == "PizzaGuy")
    {
        pizzaEnemyList.Add (enemy);
    }
    else if (enemy.name == "FiresGuy")
    {
        friesEnemyList.Add (enemy);
    }
    else if (enemy.name == "SodaGuy")
    {
        sodaEnemyList.Add (enemy);
    }
}


public int PizzaListUnactiveEnemyCount()
{
    int unactiveEnemiesCount  = 0;

    foreach (GameObject enemies in pizzaEnemyList)
    {
        if (enemies.activeInHierarchy == false)
        {
            unactiveEnemiesCount += 1;
        }
    }

    return unactiveEnemiesCount;
}

enter image description here

1 个答案:

答案 0 :(得分:2)

我已经测试了你的代码并告诉你它的工作原理如果游戏对象被正​​确添加并且它们实际上不是活动的。

您的问题很可能是没有正确地将游戏对象添加到列表中,也可能无法确保pizzaEnemyList至少有1个项目设置为非活动状态。当列表中的所有项都处于活动状态时,它返回null是正常的,因为它永远不会进入if (enemy.activeInHierarchy == false)

如果您在团结检查员中设置了public List<GameObject> pizzaEnemyList;,那会更好。除非这个解决方案不适合您正在构建的游戏。

正如Serlite所说,在使用foreach时你不需要保留一个计数器,你的代码可能如下所示:

private GameObject FetchPizzaEnemy()
{
    GameObject pizzaEnemy = null;

    foreach (GameObject enemy in pizzaEnemyList)
    {
        if (enemy.activeInHierarchy == false)
        {
            pizzaEnemy = enemy;

            pizzaEnemyList.Remove(enemy);

            return pizzaEnemy;
        }
    }

    return pizzaEnemy;
}

修改后修改:

我已使用此功能对您的代码进行了测试,并且可以正常运行:

private List<GameObject> pizzaEnemyList = new List<GameObject>();


void Start()
{
    GameObject pizzaGuy = GameObject.Find("PizzaGuy");    

    DeactivateAndStoreEnemy(pizzaGuy);
    Debug.Log(FetchPizzaEnemy());
}

private GameObject FetchPizzaEnemy()
{
    GameObject pizzaEnemy = null;

    foreach (GameObject enemy in pizzaEnemyList)
    {
        if (enemy.activeInHierarchy == false)
        {
            pizzaEnemy = enemy;

            pizzaEnemyList.Remove(enemy);

            return pizzaEnemy;
        }
    }

    return pizzaEnemy;
}

public void DeactivateAndStoreEnemy(GameObject enemy)
{
    enemy.name = "PizzaGuy";

    //decativates the enemy
    enemy.SetActive(false);



    //Store the enemy into the correct list
    if (enemy.name == "PizzaGuy")
    {
        pizzaEnemyList.Add(enemy);
    }
}

我的场景中有一个名为PizzaGuy的游戏对象。