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 ;
}
}
}
它現在的方式并不是一個真正的級別,它只是讓我在級別中設定的孩子數量。
級別我的意思是要回圈多深才能得到孩子。例如 :
Parent
Children2
Children3
Children4
Children5
Children6
Children7
Children8
Children9
例如,如果我將級別設定為 1,它應該得到 Children2 和 Children9,如果將其設定為級別 2,那么它應該得到 children2,children9 和 children3,4,5,如果設定為級別 3,那么也得到 children6,如果設定為級別 4,那么也得到兒童 7 和 8
也可以以某種方式回圈遍歷所有子遞回并映射所有級別,這樣我會知道例如有 5 個級別或 10 個級別。但主要目標是根據深度回圈找到孩子。
我試過了,但它仍然沒有按我的意愿作業:
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 中。
總是得到前一個級別和下一個級別,但如果下一個級別有更多的孩子,請不要通過里面。
首先得到一個孩子的孩子,最后得到的孩子越多,越關卡。
uj5u.com熱心網友回復:
我為你做了一個簡單的腳本。
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);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475804.html