運用遞迴查詢物件下的所有子物體
阿新 • • 發佈:2019-02-20
最近,建立了好多物件,突然想知道我到底建立了多少物件,於是。。。。
1.ctrl+a,然後alt+右方向鍵,使所有物體呈展開狀態,然後執行程式碼
Debug.Log(Selection.gameObjects.Length);
嗯,就是這樣,一句話的事,但是。。。覺得不夠方便(自己作死)於是有了2
2.還是一句話的事。。。
Debug.Log(FindObjectsOfType<Transform>().Length);
嗯。。。好像總覺得哪裡少點,這個是查詢全域性活動的transform元件,由於每個物件都必須有且只能有一個transform,所以還是可行的,但是我想知道指定的物件有多少子物體怎麼辦,於是有了3
3.那就層層查詢吧,找到一個累加1,一直累加
GameObject game = Selection.activeGameObject;
for (int i = 0; i < game.transform.childCount; i++)
{
a++;
for (int j = 0; j < game.transform.GetChild(i).childCount; j++)
{
a++;
for (int k = 0; k < game.transform.GetChild(i).GetChild(j).childCount; k++)
{
a++;
for (int n = 0; n < game.transform.GetChild(i).GetChild(j).GetChild(k).childCount; n++)
{
a++;
}
}
}
}
Debug.Log (a);
這。。。好像只能查詢四級啊,再深了就找不到了。。。而且這也不是程式設計師做的事啊這個。。。。
4.想到了遞迴?
public void FindGame(Transform t)
{
Transform[] trans = FindChild(t);
if (trans == null)
return;
for (int i = 0; i < trans.Length; i++)
{
FindGame(trans[i]);
}
}
public int a;
public Transform[] FindChild(Transform t)
{
Transform[] trans = new Transform[t.childCount];
if (t.childCount > 0)
{
for (int i = 0; i < t.childCount; i++)
{
a++;
trans[i] = t.GetChild(i);
}
return trans;
}
else
return null;
}
嗯。。最後才想到了遞迴,反射hu有點。。。
不過問題總算解決了,如果有其他解決方案還請指教。雖然只是一個簡單的,很無聊的需求。。。。