Hos*_*hno 6 c# unity-game-engine
我有一个预制场景,我想访问该预制件的一个孩子,该预制件的结构是这样的:
PauseMenu
UI_Resume
TextField
TextField2
UI_Side_Back <---- (I need this child)
UI_Home
Run Code Online (Sandbox Code Playgroud)
transform.FindChild只返回第一级子项,并且loop该转换也是第一级子项中的循环:
foreach (Transform item in PooledPause.transform) {
Debug.Log(item.name);
}
Run Code Online (Sandbox Code Playgroud)
我认为它需要是一种递归方法或其他东西.我怎么能找到那个孩子?
Dan*_*zey 11
您可以使用路径查找变换:
var target = transform.Find("UI_Resume/TextField2/UI_Side_Back");
Run Code Online (Sandbox Code Playgroud)
从以下文档Transform.Find:
如果name包含'/'字符,它将像路径名一样遍历层次结构.
小智 8
上面的“RecursiveChildFind”不起作用,因为它只会搜索一个孩子,而不是所有孩子。工作版本如下:
Transform RecursiveFindChild(Transform parent, string childName)
{
foreach (Transform child in parent)
{
if(child.name == childName)
{
return child;
}
else
{
Transform found = RecursiveFindChild(child, childName);
if (found != null)
{
return found;
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这是另一个解决方案,让您可以根据任何标准找到任何深度的孩子。它使用深度优先的方法。因此,我建议将感兴趣的对象放置在树的尽可能高的位置,以节省一些操作。
它的使用方式如下:parent.FindRecursive("child");
或者,如果您需要更多灵活性:parent.FindRecursive(child => child.GetComponent<SpriteRenderer>() != null && child.name.Contains("!"));
using System;
using UnityEngine;
public static class TransformExtensions
{
public static Transform FindRecursive(this Transform self, string exactName) => self.FindRecursive(child => child.name == exactName);
public static Transform FindRecursive(this Transform self, Func<Transform, bool> selector)
{
foreach (Transform child in self)
{
if (selector(child))
{
return child;
}
var finding = child.FindRecursive(selector);
if (finding != null)
{
return finding;
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)