如何让所有 children 的 object 递归通过级别设置?
How to get all children of object recursive with level set to go through?
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class GetChilds : MonoBehaviour
{
public List<Transform> allChildren = new List<Transform>();
// Start is called before the first frame update
void Start()
{
GetChildren(10);
}
// Update is called once per frame
void Update()
{
}
private void GetChildren(int level)
{
int count = 0;
foreach (Transform child in transform.GetComponentsInChildren<Transform>())
{
if(count == level)
{
break;
}
allChildren.Add(child);
count++;
}
}
}
现在的方式它不是一个真正的水平它只是得到然后我在水平中设置的 childs 的数量。
级别我的意思是要循环多深才能获得children。
例如:
Parent
Children2
Children3
Children4
Children5
Children6
Children7
Children8
Children9
例如,如果我将级别设置为 1,它应该得到 Children2 和 Children9
如果将它设置为 2 级,那么它应该得到 children2 children9 和 children3,4,5
如果设置为 3 级,则还获得 children6 如果设置为 4 级,则还获得 children7 和 8
也可能以某种方式循环遍历所有 children 递归并映射所有级别,这样我就会知道例如有 5 个级别或 10 个级别。但主要目标是找到 children,具体取决于循环的深度。
我试过了,但它仍然无法正常工作:
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class GetChilds : MonoBehaviour
{
public List<Transform> allChildren = new List<Transform>();
private List<int> levels = new List<int>();
// Start is called before the first frame update
void Start()
{
GetChildRecursive(transform, 3);
}
// Update is called once per frame
void Update()
{
}
private void GetChildRecursive(Transform obj, int level)
{
foreach (Transform child in obj)
{
if (null == child)
continue;
if (child.childCount > 0)
{
levels.Add(child.childCount);
}
if (levels.Count <= level)
{
allChildren.Add(child);
GetChildRecursive(child, level);
levels = new List<int>();
}
}
}
}
它现在做什么:
例如,如果我有这个结构:
Child1
Child2
Child3
Child5
Child6
Child4
如果我将级别设置为 1,则只得到 Child1
如果我将级别设置为 2,则获取 Child1、Child2、Child3、Child4
如果我将级别设置为 3,那么在这种情况下将它们全部获取。
现在的问题是,如果我将它设置为 3 级,当它到达 Child3 时,它将在 Child3 内部挖掘,我希望它只获得每个级别的顶部 Child1 Child2 Child3 Child4 而不是挖掘 Child3。
总是上一层和下一层,但如果下一层child有更多children.
,则不要进入内部
先得children一个child最后越多关卡越进
我为你做了一个简单的脚本。
使用目标变换调用 IterateOverChild
方法,0 作为当前级别参数和所需深度。
public class TranformIterator : MonoBehaviour
{
void Start()
{
IterateOverChild(transform, 0, 2);
}
private void IterateOverChild(Transform original, int currentLevel, int maxLevel)
{
if (currentLevel > maxLevel) return;
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}"); //Do with child what you need
IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
}
}
}
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class GetChilds : MonoBehaviour
{
public List<Transform> allChildren = new List<Transform>();
// Start is called before the first frame update
void Start()
{
GetChildren(10);
}
// Update is called once per frame
void Update()
{
}
private void GetChildren(int level)
{
int count = 0;
foreach (Transform child in transform.GetComponentsInChildren<Transform>())
{
if(count == level)
{
break;
}
allChildren.Add(child);
count++;
}
}
}
现在的方式它不是一个真正的水平它只是得到然后我在水平中设置的 childs 的数量。
级别我的意思是要循环多深才能获得children。 例如:
Parent
Children2
Children3
Children4
Children5
Children6
Children7
Children8
Children9
例如,如果我将级别设置为 1,它应该得到 Children2 和 Children9 如果将它设置为 2 级,那么它应该得到 children2 children9 和 children3,4,5 如果设置为 3 级,则还获得 children6 如果设置为 4 级,则还获得 children7 和 8
也可能以某种方式循环遍历所有 children 递归并映射所有级别,这样我就会知道例如有 5 个级别或 10 个级别。但主要目标是找到 children,具体取决于循环的深度。
我试过了,但它仍然无法正常工作:
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class GetChilds : MonoBehaviour
{
public List<Transform> allChildren = new List<Transform>();
private List<int> levels = new List<int>();
// Start is called before the first frame update
void Start()
{
GetChildRecursive(transform, 3);
}
// Update is called once per frame
void Update()
{
}
private void GetChildRecursive(Transform obj, int level)
{
foreach (Transform child in obj)
{
if (null == child)
continue;
if (child.childCount > 0)
{
levels.Add(child.childCount);
}
if (levels.Count <= level)
{
allChildren.Add(child);
GetChildRecursive(child, level);
levels = new List<int>();
}
}
}
}
它现在做什么:
例如,如果我有这个结构:
Child1
Child2
Child3
Child5
Child6
Child4
如果我将级别设置为 1,则只得到 Child1
如果我将级别设置为 2,则获取 Child1、Child2、Child3、Child4
如果我将级别设置为 3,那么在这种情况下将它们全部获取。 现在的问题是,如果我将它设置为 3 级,当它到达 Child3 时,它将在 Child3 内部挖掘,我希望它只获得每个级别的顶部 Child1 Child2 Child3 Child4 而不是挖掘 Child3。
总是上一层和下一层,但如果下一层child有更多children.
,则不要进入内部先得children一个child最后越多关卡越进
我为你做了一个简单的脚本。
使用目标变换调用 IterateOverChild
方法,0 作为当前级别参数和所需深度。
public class TranformIterator : MonoBehaviour
{
void Start()
{
IterateOverChild(transform, 0, 2);
}
private void IterateOverChild(Transform original, int currentLevel, int maxLevel)
{
if (currentLevel > maxLevel) return;
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}"); //Do with child what you need
IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
}
}
}