首页 > 代码库 > 如何 正确 删除 子物体
如何 正确 删除 子物体
这几天做项目的时候发现 自己删除子物体之后,再新建子物体,发现原来的子物体的函数依旧被调用了。
后来看了一下,发现是由于子物体绑定了一个父物体的委托,在销毁的时候没有去除父物体的委托。
但是这个调试 引发了我另外一个思考:
我发现在删除子物体之后,调用 tranform.childcout 属性,发现没有变为0。
删除子物体代码如下:
1 void DetoryChilds(Transform tar)2 {3 for (int i = tar.childCount - 1; i >= 0; --i)4 {5 var child = transform.GetChild(i).gameObject;6 Destroy(child);7 }8 }
google 了 一下,原因是因为 object destruction 是在所有的 update 执行之后的。虽然在 DestroyChilds 函数中 销毁了,但是要在 update 之后才算 真正销毁,这也是为什么 销毁了的子物体 还能 响应 父物体的委托(好吧,貌似这是托管的)。
解决:
发现了原因,解决就简单了。直接上成功代码吧
1 IEnumerator Start () { 2 3 yield return new WaitForSeconds(0.5f); 4 5 //foreach (Transform child in transform) 6 //{ 7 // Destroy(child); 8 //} 9 //Can‘t destroy Transform component of ‘1‘. If you want to destroy the game object, please call ‘Destroy‘ on the game object instead. Destroying the transform component is not allowed.10 11 12 //-GameObject13 // -114 // -215 // -316 // -417 18 //condition is based on the assumption that GetChildCount() is decreased as soon as Destroy() is called.19 20 //According to the reference manual, actual object destruction is always delayed 21 //until after the current Update loop.22 23 //your for condition will never be false, and you are caught in an endless loop.24 25 //---- wrong26 //while (transform.childCount > 0)27 //{28 // Destroy(transform.GetChild(0).gameObject);29 //}30 31 //Method 132 while (transform.childCount > 0)33 {34 Debug.Log(transform.childCount);35 36 Destroy(transform.GetChild(0).gameObject);37 38 yield return new WaitForEndOfFrame();39 }40 41 //Method 242 DetoryChilds(transform);43 ///没有变为044 Debug.Log(transform.childCount);45 46 //can not while (transform.childCount > 0) { } ,it pause at main thread 47 //you need yield return new WaitForEndOfFrame();48 yield return new WaitForEndOfFrame();49 Debug.Log(transform.childCount);50 51 if (signal != null) signal();52 }
果然 unity3d 还是 有很多坑,需要 细心 查看一下。
参考:http://forum.unity3d.com/threads/deleting-all-chidlren-of-an-object.92827/
如何 正确 删除 子物体
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。