如何找到从根GameObject开始的GameObject(在层次结构中的较低部分)?

时间:2019-06-01 21:54:19

标签: c# unity3d

好的,这个有点难以解释。

  • 假设您的游戏中有多个角色。
  • 每个角色(预制)可能具有不同的骨骼结构和骨骼名称。
  • 为简单起见,您重命名了某些GameObjects(在预制件中)。 (例如每个 角色有一个名为“ Head”的GameObject)

现在,在给定OnTriggerEnter()方法的情况下,您将从对撞机中找到“根” GameObject。

从这一点来看,如何从该GameObject的根目录中找到“ Head”游戏对象?

请记住,每个GameObject(字符)都包含一个Head。您想找到此特定GameObject的头部。

我尝试过的代码:(返回空引用)

private void OnTriggerEnter(Collider char)
{
    var en = char.gameObject;
    var head = en.transform.Find("Head");
}

是否可以不显式地键入每种不同类型的骨骼结构的层次结构?

3 个答案:

答案 0 :(得分:1)

查找不降级变换层次结构。如果找不到null is returned子代,则“查找”只会搜索给定的子代列表,以寻找命名的“变形”。换句话说,它不会看其子代的子代。如果您希望在已经是孩子的孩子上使用Find,则必须像使用/的路径那样访问它,例如。 transform.Find("Body/Head")

像这样的一般字符串引用是一个非常糟糕的主意,您可以通过创建一个空脚本(假设是Head.cs)并将其附加到父GameObject的子代中来实现,而不是寻找通过字符串引用转译,您可以查找组件Head.cs

它看起来像这样:

private void OnTriggerEnter(Collider collider)
{
   //Where Head is an empty script attached to the Head.
   var head = collider.GetComponentInChildren<Head>();
   //Do something... Logging the name for example
   Debug.log(head.transfrom.name);
}

答案 1 :(得分:0)

氦在评论中是正确的。请称赞他或她的努力!

这是答案的简化版本:

    public static Transform FindDeepChild(Transform aParent, string aName)
    {
        Queue<Transform> queue = new Queue<Transform>();
        queue.Enqueue(aParent);
        while (queue.Count > 0)
        {
            var c = queue.Dequeue();
            if (c.name == aName) return c;
            foreach (Transform t in c) queue.Enqueue(t);
        }
        return null;
    }

答案 2 :(得分:0)

这是更简单的版本:

公共静态转换FindDeepChild(转换aParent,字符串aName) {

    var headList = collider.GetComponentInChildren<Transform>(true);

    foreach(var it in headList)
        if (it.name == "Head")
            return it;
    return null;

}