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

