好的,这个有点难以解释。
现在,在给定OnTriggerEnter()
方法的情况下,您将从对撞机中找到“根” GameObject。
从这一点来看,如何从该GameObject的根目录中找到“ Head”游戏对象?
请记住,每个GameObject(字符)都包含一个Head。您想找到此特定GameObject的头部。
我尝试过的代码:(返回空引用)
private void OnTriggerEnter(Collider char)
{
var en = char.gameObject;
var head = en.transform.Find("Head");
}
是否可以不显式地键入每种不同类型的骨骼结构的层次结构?
答案 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;
}