zoukankan      html  css  js  c++  java
  • 如何 正确 删除 子物体

    这几天做项目的时候发现 自己删除子物体之后,再新建子物体,发现原来的子物体的函数依旧被调用了。

    后来看了一下,发现是由于子物体绑定了一个父物体的委托,在销毁的时候没有去除父物体的委托。

     

    但是这个调试 引发了我另外一个思考:

    我发现在删除子物体之后,调用 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     //-GameObject
    13     //    -1
    14     //    -2
    15     //    -3
    16     //    -4
    17         
    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     //---- wrong
    26     //while (transform.childCount > 0)
    27     //{
    28     //    Destroy(transform.GetChild(0).gameObject);
    29     //}
    30 
    31     //Method 1
    32     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 2
    42     DetoryChilds(transform);
    43     ///没有变为0
    44     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/

  • 相关阅读:
    docker学习
    io性能调优之page cache
    ll命令执行后结果分析
    Angular2+ ViewChild & ViewChildren解析
    <router-outlet> 干什么用的?
    npm基本命令
    什么情况下会出现undefined
    关于VUE调用父实例($parent) 根实例 中的数据和方法
    vue中的this指向问题
    对 Foreach 的理解
  • 原文地址:https://www.cnblogs.com/chongxin/p/4114489.html
Copyright © 2011-2022 走看看