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
相关产品推荐
相关产品推荐

