找一个gameObject的孩子

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)


Noe*_*mer 5

这是另一个解决方案,让您可以根据任何标准找到任何深度的孩子。它使用深度优先的方法。因此,我建议将感兴趣的对象放置在树的尽可能高的位置,以节省一些操作。

它的使用方式如下: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)