博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNITY Destroy()和DestroyImadiate()的区别
阅读量:7281 次
发布时间:2019-06-30

本文共 3092 字,大约阅读时间需要 10 分钟。

using System.Collections;using System.Collections.Generic;using System.Timers;using UnityEngine;using System.Diagnostics;public class testdestroy : MonoBehaviour {    GameObject cubeGo;    Transform rootTrans;    // Use this for initialization    Stopwatch timer;    void Start () {        cubeGo = GameObject.Find("Cube");        rootTrans = GameObject.Find("root").transform;        timer = new Stopwatch();    }        // Update is called once per frame    void Update () {        if (Input.GetKey(KeyCode.LeftControl))        {            var go = Instantiate(cubeGo);            go.transform.SetParent(rootTrans);                    }        else if (Input.GetKey(KeyCode.A))        {//11111111111            for (int i = 0; i < rootTrans.GetChildCount(); ++i)            {                timer.Reset();                timer.Start();                Destroy(rootTrans.GetChild(i).gameObject);                timer.Stop();                UnityEngine.Debug.Log("1:time elipsed===:" + timer.Elapsed);            }            rootTrans.DetachChildren();        }        else if (Input.GetKey(KeyCode.D))        {//2222222222            while (true)            {                var cc = rootTrans.childCount;                //UnityEngine.Debug.Log("cc============================" + cc);                if (cc == 0)                    break;                timer.Reset();                timer.Start();                DestroyImmediate(rootTrans.GetChild(0).gameObject);                timer.Stop();                UnityEngine.Debug.Log("2:time elipsed===:" + timer.Elapsed);            }        }        else if (Input.GetKey(KeyCode.F))        {            DestroyImmediate(cubeGo.transform);        }    }}
1,DestroyImmediate立即销毁目标,并将目标置为null,且将目标的所有上层引用置空,如用DestroyImmediate销毁OBJ下的所子物体后 OBJ.childcount将变为0,见代码//22222222222
2,Destroy则在本帧结束前,渲染之前销毁目标和上层引用。不会立即销毁,Destroy调用后,目标数据仍然存在,不为null,上层引用也正常。见代码//111111111处,因为销毁物体后,childcount 仍然保持不变,这常会造成其它地方的逻辑出错,子结点已经销毁了却还能取到,因此,我们应该将子结点从父物体摘除,rootTrans.DetachChildren();这样其它地方代码再获取子结点及其数量时就不导致逻辑出错了。
3,基于上述原理,测试Destroy和DestroyImmediate的时间占用,发现后者几乎是前者的10倍。 补充:
void Start () {        var root = gameObject.transform;        for (var i = 0; i < root.childCount; ++i)        {
//方式一,正确删除所有子结点 var c = root.GetChild(i).gameObject; GameObject.Destroy(c); } for (var i = 0; i < root.childCount; ++i) {
//方式二,删不干净,会有一些剩余节点 var c = root.GetChild(0).gameObject; GameObject.DestroyImmediate(c); } for (var i = 0; i < root.childCount; ++i) {
//方式三,删不干净,会有一些剩余节点,只删除了偶数节点0,2,4,6,剩余奇数节点1,3,5,7 var c = root.GetChild(i).gameObject; GameObject.DestroyImmediate(c); } while (root.childCount > 0) {
//方式四,正确删除所有子结点 var c = root.GetChild(0).gameObject; GameObject.DestroyImmediate(c); }
  

      for (int i = go.childCount - 1; i >= 0; i--) {

//方式五,正确删除所有子结点
        GameObject.DestroyImmediate(go.GetChild (i).gameObject);
      }

}

 

转载于:https://www.cnblogs.com/timeObjserver/p/6679632.html

你可能感兴趣的文章
lockf
查看>>
洛谷P2697 宝石串
查看>>
css3 在线编辑工具 连兼容都写好了
查看>>
移动端 Retina屏border实现0.5px
查看>>
ios 自定义NSError
查看>>
DBCP连接池
查看>>
4.2 time & datetime 模块
查看>>
m4-第四次考试
查看>>
基于NiosII的TRDB-LTM控制器IP核的设计
查看>>
Skia引擎API整理介绍
查看>>
python file operations
查看>>
spring的注入
查看>>
拦截导弹 (NYOJ—79) 最长字串问题 (NYOJ—17)
查看>>
【分享】免费建立自己的站点
查看>>
表单的验证:客户端验证和服务器端验证
查看>>
c++ 类初始化
查看>>
How to deal with the problem '<' in OpenERP's view file
查看>>
Linux下方便的块设备查看工具lsblk
查看>>
C#制作在线升级程序
查看>>
Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
查看>>