分为两步:
1.找到子物体的transform
2.通过child.parent = root,输出路径
找到子物体的transform
有三种方法:GetComponentsInChildren,递归查找,栈查找
GetComponentsInChildren
foreach (Transform t in check.GetComponentsInChildren<Transform>())
{
if (t.name == name)
{
Debug.Log("得到最终子物体的名字是:" + t.name);
forreturn = t;
return t;
}
}
递归
static Transform SearchNodeByRecursion(Transform tree, string valueToFind)
{
if (tree.name == valueToFind)
{
return tree;
}
else
{
if (tree.childCount > 0)
{
for (int i = 0; i < tree.childCount; i++)
{
var temp = SearchNodeByRecursion(tree.GetChild(i), valueToFind);
if (temp != null) return temp;
}
}
}
return null;
}
栈
static Transform SearchNodeByStack(Transform rootNode, string valueToFind)
{
var stack = new Stack<Transform>(new[] { rootNode });
while (stack.Count > 0)
{
var n = stack.Pop();
if (n.name == valueToFind)
{
//出栈,如果找到目标返回
return n;
}
//当前节点还有child,全部入栈
if (n.childCount > 0)
{
for (int i = 0; i < n.childCount; i++)
{
stack.Push(n.GetChild(i));
}
}
}
//栈为0还没找到
return null;
}
输出路径
string GetChildPath(Transform check, string name)
{
List<string> listPath = new List<string>();
string path = "";
Transform child = GetTransform(check, name);
Transform parent = child.parent;
if (child != null)
{
listPath.Add(child.name);
while (parent != null && parent != check )
{
listPath.Add(child.parent.name);
parent = parent.parent;
}
}
listPath.Add(check.name);
for (int i = listPath.Count-1; i>= 0; i--)
{
path += listPath[i];
if (i != 0)
{
path += "/";
}
}
return path;
}
源码
https://github.com/luoyikun/UnityForTest
FindChild场景