在GameObject中为每个子对象添加子对象到列表中,添加多于它应该添加的

本文关键字:添加 对象 于它应 列表 GameObject | 更新日期: 2023-09-27 18:07:10

现在我的代码

void UpdateList()
{
    foreach (Transform child in gameObject.transform) if (child.CompareTag("Food"))
    {
        FoodList.Add(child.gameObject);
    }
}
void EnableFood()
{
    UpdateList();
    foreach (GameObject Food in FoodList) if (Food.CompareTag("Food"))
    {
        Food.gameObject.SetActive(true);
        Food.gameObject.GetComponent<Food>().Claimed = false;
    }
}

我所拥有的是标记为Food的孩子列表,该列表是"Farm"的一部分。玩家可以与农场中的食物互动,如果玩家与Food对象碰撞,该孩子将从列表中删除并设置为非活动状态。20秒后,它会再次激活,让它看起来像食物在重生。

代码的问题是,当我做FoodList.Add(child.gameObject);时,它不只是添加父级中的子级数量,它增加了更多。
默认有8个子节点,当我运行UpdateList()方法时,它增加了28个子节点。

—编辑显示从开始到结束发生的事情。

public List<GameObject> FoodList = new List<GameObject>();
void Update()
{
    UpdateList();
}
void UpdateList()
{
    foreach (Transform child in gameObject.transform) if (child.CompareTag("Food"))
    {
        FoodList.Add(child.gameObject);
    }
}
//At this point the list already has 14 objects in it.
//(Also made some minor changes that I made because I was frustrated the code didnt work..)
//Right now I have my parent GameObject
//that contains 8 childs with the tag Food in the editor.
//Now were moving to the Player his script.
void OnTriggerEnter(Collider Object)
{
    if (Object.gameObject.tag == "Farm")
    {
        Farm = Object.gameObject.transform.parent;
        FoodListPlayer = Farm.GetComponent<FoodSpawn>().FoodList;
    }
}
//Here the collided object Food is set to inactive and removed from the list.
void OnCollisionEnter(Collision Object)
{
    if (Object.gameObject.tag == "Food")
    {
        Object.gameObject.SetActive(false);
        FoodListPlayer.Remove(Object.gameObject);
    }
}

我认为在foreach循环中,它只添加父元素中所包含的子元素,如果每个子元素都在列表中,它就会停止添加,这可能就是我现在的问题所在。

在GameObject中为每个子对象添加子对象到列表中,添加多于它应该添加的

问题非常简单,一旦你将gameObject添加到列表中,你就不会从它的子对象中删除该gameObject。所以当下一次UpdateList()调用时,它将再次添加所有的gameObjects。所以要么你必须从它的子对象中删除gameObject,要么你必须将其编码为一个gameObject只能添加到List中一次。

希望这对你有帮助。

最好的,Hardik .