You need to enable JavaScript to run this app. Unity子节点列表使用预制体生成棋盘路径时元素翻倍如何处理
优惠活动
大模型
产品
解决方案
定价
更多

Unity子节点列表使用预制体生成棋盘路径时元素翻倍如何处理

问题根源

你当前使用的GetComponentsInChildren<Transform>()是递归检索所有后代节点的API,除了Board下的Tile父节点外,每个Tile下的Cube-visual子节点也会被纳入检索结果,最终导致列表元素数量是预期的2倍。

解决方案

你可以直接修改FillNodes()方法,改为仅遍历Board的一级子节点,不需要递归检索深层后代,即可过滤掉Tile下的子节点:

方案1(无其他一级子节点时最优)

如果Board下的所有直接子节点都是你需要的Tile节点,直接遍历当前对象的子Transform即可:

void FillNodes()
{
    childNodeList.Clear();
    // transform遍历默认只拿直接子节点,不会递归查找深层后代
    foreach (Transform child in transform)
    {
        childNodeList.Add(child);
    }
}

方案2(需要过滤一级子节点时使用)

如果Board下还存在其他不需要纳入路径的一级子节点,可以额外增加名称判断逻辑,仅保留名称以Tile开头的节点:

void FillNodes()
{
    childNodeList.Clear();
    foreach (Transform child in transform)
    {
        // 仅添加名称符合Tile(x)格式的节点
        if (child.name.StartsWith("Tile"))
        {
            childNodeList.Add(child);
        }
    }
}

方案3(兼容原API写法)

如果你需要保留GetComponentsInChildren的用法,也可以增加层级和名称判断:

void FillNodes()
{
    childNodeList.Clear();
    childObjects = GetComponentsInChildren<Transform>();
    foreach(Transform child in childObjects)
    {
        // 排除自身、仅保留Board的直接子节点、且名称符合Tile规则
        if(child != this.transform && child.parent == this.transform && child.name.StartsWith("Tile"))
        {
            childNodeList.Add(child);
        }
    }
}

修改完成后运行测试,childNodeList就只会保留你需要的8个Tile节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 11:24:02