Unity3D節點排序規則


在Unity3D編輯器中添加GameObject時,Unity會自動按照GameObject的名稱進行排序(暫未找到設置該排序開關的功能,如有還請網友告知~)。當使用Transform.GetChild(index)遍歷某GameObject的子節點時,其索引順序也是根據該排序而定。
 
除了在編輯器中添加GameObject以外,還可以在代碼中動態創建GameObject並添加到當前場景中,例如:
 
codeA: 
son_transform.parent = father_transfrom;
son_transform.name = "object_name";
codeA先為父節點添加子節點,然后給子節點重命名
 
codeB :
son_transform.name = "object_name";
son_transform.parent = father_transform;
codeB先為子節點重命名,然后將其添加到父節點之下。
 
codeA與codeB的差別在於兩個語句的先后順序,但在使用GameObject.GetChild()來遍歷子節點時,這一先后順序會對子節點遍歷順序產生影響。
         mother_object.name = "C";
 
        for (int i = 0; i < 3; i++ )
        {
            GameObject new_obj = GameObject.Instantiate(mother_object) as GameObject;
            new_obj.transform.parent = transform;
            new_obj.name = "T" + i;
        }
 
        for (int i = 0; i < 3; i++)
        {
            GameObject new_obj = GameObject.Instantiate( mother_object ) as GameObject;
            new_obj.transform.parent = transform;
            new_obj.name = "A" + i;
        }
 
        for (int i = 0; i < 3; i++)
        {
            GameObject new_obj = GameObject.Instantiate( mother_object ) as GameObject;
            new_obj.transform.parent = transform;
            new_obj.name = "F" + i;
        }
 
        for (int i = 0; i < transform.childCount;i++ )
        {
            Debug.Log("transform " + i + " name " + transform.GetChild(i).name);
        }

上面的測試代碼段使用的是codeA方式來添加子節點,相應的輸出結果是:

transform 0 name A0
transform 1 name A1
transform 2 name A2
transform 3 name F2
transform 4 name F1
transform 5 name F0
transform 6 name T2
transform 7 name T1
transform 8 name T0
 
 
而如果將上面的測試代碼改成使用codeB方式來添加子節點,其輸出結果則是:
 
transform 0 name A0
transform 1 name A1
transform 2 name A2
transform 3 name F0
transform 4 name F1
transform 5 name F2
transform 6 name T0
transform 7 name T1
transform 8 name T2
 
由此推斷,在執行transform.parent = parent_trans;會觸發由小到大的插入排序,而重命名時不會再次排序。
所以在代碼中動態添加GameObject,並且代碼邏輯依賴於子節點的遍歷順序時,要格外注意".parent =" 和 ".name ="的執行順序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM