以CocosCreator为例,Unity3D同理。这里提供三种获得子物体的方式。
/**
* 从目标节点及其子孙节点中找到满足`name`的节点.
* 未找到满足条件的,返回null
* @param targetNode
* @param name
*/
public static Search(targetNode: cc.Node, name: string): cc.Node {
if (targetNode.name == name) {
return targetNode;
}
for (let i = 0; i < targetNode.children.length; i++) {
const child = targetNode.children[i];
let result = this.Search(child, name);
if (result != null) {
return result;
}
}
return null;
}
/**
* 从子孙节点中找到第一个名字符合的节点,不包括目标节点本身。
* 使用 深度优先的方式。
* 若没有找到,则返回null
* @param targetNode
* @param name
*/
public static FindChildByName(targetNode: cc.Node, name: string): cc.Node {
for (let i = 0; i < targetNode.children.length; i++) {
const child = targetNode.children[i];
if (child.name == name) {
return child;
}
let result = this.FindChildByName(child, name);
if (result != null)
return result;
}
return null;
}
/**
* 从子孙节点中找到第一个名字符合的节点,不包括targetNode节点本身。
* 使用 广度优先的方式。
* 若没有找到,则返回null
* @param targetNode
* @param name
*/
public static FindChildByName2(targetNode: cc.Node, name: string): cc.Node {
let queue: Queue<cc.Node> = new Queue();
queue.Enqueue(targetNode);
while (queue.Count() > 0) {
let t = queue.Dequeue();
if (t.name == name) {
if (t != targetNode) {
return t;
}
}
for (let i = 0; i < t.children.length; i++) {
const element = t.children[i];
queue.Enqueue(element);
}
}
return null;
}
参考文档
https://answers.unity.com/questions/799429/transformfindstring-no-longer-finds-grandchild.html