我正在尝试遍历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;
}
答案 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的游戏对象。