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

如何编写类对GameObject的子对象进行分组排序?

修复GameObject子对象分组排序的代码问题

我来帮你梳理下这段代码里的问题,然后给出能正常工作的修复版本~

原代码的核心问题

  • 遍历中修改父物体导致计数混乱:当你在for循环里把子对象移到新父物体时,原transform.childCount会实时减少,这会让循环的索引逻辑彻底乱掉——要么漏处理很多子对象,要么最后出现索引越界的错误。
  • 分组逻辑完全错误:你的index计数到3时才创建容器,然后只把当前第i个对象移进去,那前两个子对象根本没被分到任何组里,完全达不到“每3个一组”的需求。
  • 执行时机不灵活:依赖Start在编辑模式下执行,只能在脚本加载或场景刷新时触发,后续调整子对象后没法快速重新分组。

修复后的代码

我调整了逻辑,先缓存所有子对象避免遍历异常,同时优化了分组逻辑,还加了更灵活的触发方式:

using UnityEngine;

[ExecuteInEditMode]
public class ChildGrouping : MonoBehaviour
{
    // 右键点击脚本组件就能看到这个选项,随时触发分组
    [ContextMenu("Group Every 3 Children")]
    public void GroupChildrenInSets()
    {
        // 可选:先清理已有的分组容器(避免重复分组)
        ClearExistingGroups();

        // 先把所有子对象存入数组,避免遍历过程中父物体变化导致的计数问题
        Transform[] allChildren = new Transform[transform.childCount];
        for (int i = 0; i < transform.childCount; i++)
        {
            allChildren[i] = transform.GetChild(i);
        }

        // 每3个一组创建容器,自动处理最后一组不足3个的情况
        for (int i = 0; i < allChildren.Length; i += 3)
        {
            // 创建分组容器,命名更清晰
            GameObject group = new GameObject($"Group_{(i / 3) + 1}");
            group.transform.parent = transform;
            // 保持容器在层级中的顺序和原子对象对应
            group.transform.SetSiblingIndex(i / 3);

            // 将当前组的子对象移入容器
            for (int j = i; j < i + 3 && j < allChildren.Length; j++)
            {
                allChildren[j].parent = group.transform;
                // 保持子对象在组内的顺序不变
                allChildren[j].SetSiblingIndex(j - i);
            }
        }
    }

    // 清理已有的分组容器
    private void ClearExistingGroups()
    {
        // 倒序遍历删除,避免索引混乱
        for (int i = transform.childCount - 1; i >= 0; i--)
        {
            Transform child = transform.GetChild(i);
            if (child.name.StartsWith("Group_"))
            {
                DestroyImmediate(child.gameObject);
            }
        }
    }
}

代码改进点说明

  1. 缓存子对象数组:先把所有子对象存入数组,后续修改父物体不会影响遍历的数据源,彻底解决了动态childCount带来的遍历异常问题。
  2. 步长为3的循环:直接按每3个一组处理,逻辑清晰,还能自动适配最后一组不足3个的情况(比如50个子对象的话,最后一组是2个)。
  3. 右键菜单触发:添加[ContextMenu]后,你可以右键点击脚本组件,随时执行分组操作,比依赖Start灵活太多。
  4. 维护层级顺序:通过SetSiblingIndex保证分组容器和子对象的顺序和原层级完全一致,不会打乱原有排列。
  5. 可选的旧分组清理:ClearExistingGroups方法可以避免重复分组,如果你不需要清理旧分组,删掉这个方法调用就行。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:25