码迷,mamicode.com
首页 > 编程语言 > 详细

unity, destroy all children

时间:2016-03-06 06:39:19      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

删除node的所有子节点:

错误方法:

int childCount = node.transform.childCount;

        for (int i=0; i<childCount; i++) {
            GameObject child=node.transform.GetChild(i).gameObject;
            Destroy(child);
        }

以上方法之所以错误,是因为Destroy在下一帧才生效,而在本帧之内各child还存在,例如在上面代码之后输出node.transform.childCount会发现结果不为0。所以如下接下来的逻辑对child是否已经立即删除有依赖(很多时候会有依赖,比如在删除child之后又创建同名的child,并使用findChild获取并修改之,则此时将无法确定到底是修改了已删除的还是修改了新创建的),则会造成莫名奇妙的逻辑错误。

正确方法1:
        List<GameObject> childList = new List<GameObject> ();
        
        int childCount = node.transform.childCount;
        for (int i=0; i<childCount; i++) {
            GameObject child=node.transform.GetChild(i).gameObject;
            childList.Add(child);
        }
        for (int i=0; i<childCount; i++) {
            childList[i].transform.parent=null;
            Destroy(childList[i]);
        }
        (node.transform.childCount == 0).MustBeTrue ();
        
正确方法2:

            List<GameObject> childList = new List<GameObject> ();

            int childCount = node.transform.childCount;
            for (int i=0; i<childCount; i++) {
                GameObject child=node.transform.GetChild(i).gameObject;
                childList.Add(child);
            }
            for (int i=0; i<childCount; i++) {
                DestroyImmediate(childList[i]);
            }


由于unity官方强烈不推荐使用DestroyImmediate,所以最好是用方法1.

unity, destroy all children

标签:

原文地址:http://www.cnblogs.com/wantnon/p/5246470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!