-2

在脚本的顶部:

public GameObject naviParent;

父级只是空的游戏对象

然后我想找到这个父母的孩子,当游戏开始时孩子被启用为假!

我后来在脚本中做了:

GameObject navi = naviParent.Find("NAVI Destination");

但是在 naviParent.Find 上出现错误

无法使用实例引用访问成员“GameObject.Find(string)”;改为使用类型名称来限定它

我想启用真正的孩子父母的孩子。

4

1 回答 1

1

请注意,既有GameObject.Find哪些存在static,又有Transform.Find哪些不存在。

他们做不同的事情:

  • GameObject.Find在整个场景层次结构中搜索并返回第一个遇到的具有给定名称的活动对象。

    如果这是您想要的,那么您将在没有实例的情况下使用它,因为如上所述它是静态的:

    GameObject navi = GameObject.Find("NAVI Destination");
    
  • Transform.FindTransform仅在给定参考上搜索第一级子级。如果对象进一步嵌套,除非您提供完整的相对路径,否则将找不到它

    someTransform.Find("SomeFirstLevelChild/SomeSecondLevelChild/SearchedObjectName");
    

    所以你可能想使用

    GameObject navi = naviParent.transform.Find("NAVI Destination").gameObject;
    

    如前所述,仅当NAVI Destination它是对象的直接子naviParent对象时才有效。


如果您还希望能够找到嵌套的非活动孩子,您可以执行类似的操作

public static class TransformExtensions
{
    public Transform FindRecursive(this Transform transform, string name)
    {
        var children = transform.GetComponentsInChildren<Transform>(true);

        foreach(var child in children)
        {
            if(child == transform) continue;
       
            if(child.name.Equals(name))
            {
                return child;
            }
        }

        return null;
    }
}

然后像这样使用它

GameObject navi = naviParent.transform.FindRecursive("NAVI Destination").gameObject;
于 2020-10-13T16:02:20.443 回答