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

Unity如何遍历获取深层子物体 为每面墙下所有立方体上色

场景说明

当前场景共有2面墙,每面墙包含4个子对象,每个子对象各自带有1个需要上色的立方体子节点,层级结构如下:
子层级结构

现有问题

原代码仅能为每面墙4个子对象中的1个上色,无法覆盖全部4个,原代码如下:

private void ColorWalls()
{
    for (int i = 0; i < walls.Count; i++)
    {
        if (randomColors)
        {
            walls[i].transform.GetChild(0).transform.GetChild(0).GetComponent<Renderer>().material.color
                = GetRandomColour32();
        }
        else
        {
            walls[i].transform.GetChild(0).transform.GetChild(0).GetComponent<Renderer>().material.color = colors[i];
        }
    }
}

解决方案

问题根源在于原代码仅遍历了墙集合,每面墙只访问了索引为0的第一个子对象,没有遍历每面墙下的全部4个子对象,新增一层嵌套循环遍历墙的子对象即可解决。

方案1:每面墙的所有立方体使用同一种颜色(对齐原有逻辑)

private void ColorWalls()
{
    for (int i = 0; i < walls.Count; i++)
    {
        // 提前确定当前墙的统一目标色,避免重复计算
        Color targetColor = randomColors ? GetRandomColour32() : colors[i];
        // 遍历当前墙下的所有子对象
        for (int j = 0; j < walls[i].transform.childCount; j++)
        {
            // 取子对象下的第一个立方体节点上色
            walls[i].transform.GetChild(j).GetChild(0).GetComponent<Renderer>().material.color = targetColor;
        }
    }
}

方案2:每个立方体使用独立随机颜色

如果需要每个立方体单独生成随机色,可将随机色生成逻辑放到子对象循环内:

private void ColorWalls()
{
    for (int i = 0; i < walls.Count; i++)
    {
        for (int j = 0; j < walls[i].transform.childCount; j++)
        {
            Color targetColor;
            if (randomColors)
            {
                // 每个立方体单独生成随机色
                targetColor = GetRandomColour32();
            }
            else
            {
                targetColor = colors[i];
            }
            walls[i].transform.GetChild(j).GetChild(0).GetComponent<Renderer>().material.color = targetColor;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:51:03