Unity中如何终止持续添加GameObject的foreach循环
Unity中解决Character物体重复添加到列表的问题
你贴的这段代码本身不会触发无限循环——GameObject.FindGameObjectsWithTag("Character")会一次性返回场景中所有带Character标签的物体数组,foreach只会遍历数组里的每一项一次,添加完成就停止。你遇到的"无限重复添加"大概率是以下原因导致的:
- 脚本被挂载到了多个GameObject上,每个物体的
Start方法都会执行一次添加操作,导致列表被反复填充 - 你误将这段代码写在了
Update(每帧执行)方法里,而非Start/Awake(仅初始化阶段执行一次) - 场景中在循环执行时动态生成了新的
Character标签物体(但你的代码里没有相关逻辑,可能性较低)
修正方案
方案1:确保初始化逻辑只执行一次,且避免重复添加
public List<GameObject> characterList = new List<GameObject>(); void Awake() { // 先清空列表,防止重复挂载脚本导致的重复添加 characterList.Clear(); // 一次性获取所有目标物体 GameObject[] targetCharacters = GameObject.FindGameObjectsWithTag("Character"); foreach (GameObject character in targetCharacters) { // 可选:检查物体是否已在列表中,彻底避免重复 if (!characterList.Contains(character)) { characterList.Add(character); } } }
方案2:更简洁的数组转列表写法
如果不需要额外检查,直接用Linq将查询结果转成列表:
using System.Linq; // 需添加该引用 public List<GameObject> characterList = new List<GameObject>(); void Start() { // 一步完成查询和赋值,避免遍历重复添加 characterList = GameObject.FindGameObjectsWithTag("Character").ToList(); }
关键注意事项
- 把脚本挂载到一个单独的管理类物体(比如空的
GameManager物体)上,确保整个场景只执行一次初始化逻辑 - 绝对不要把这段查询添加的代码放在
Update/FixedUpdate这类每帧运行的方法中 - 如果场景中的
Character物体是后续动态生成的,在生成代码里直接调用characterList.Add(新物体)即可,不用反复执行标签查询
内容的提问来源于stack exchange,提问作者prkash
相关产品推荐
相关产品推荐

