1. 程式人生 > >運用遞迴查詢物件下的所有子物體

運用遞迴查詢物件下的所有子物體

最近,建立了好多物件,突然想知道我到底建立了多少物件,於是。。。。

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有點。。。
不過問題總算解決了,如果有其他解決方案還請指教。雖然只是一個簡單的,很無聊的需求。。。。