在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。所以当下一次UpdateList()调用时,它将再次添加所有的gameObjects。所以要么你必须从它的子对象中删除gameObject,要么你必须将其编码为一个gameObject只能添加到List中一次。
希望这对你有帮助。
最好的,Hardik .