You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:45:38