UNITY Destroy()和DestroyImadiate()的区别
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 = ; 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 == )
break;
timer.Reset(); timer.Start();
DestroyImmediate(rootTrans.GetChild().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 = ; i < root.childCount; ++i)
{//方式一,正确删除所有子结点
var c = root.GetChild(i).gameObject;
GameObject.Destroy(c);
}
for (var i = ; i < root.childCount; ++i)
{//方式二,删不干净,会有一些剩余节点
var c = root.GetChild().gameObject;
GameObject.DestroyImmediate(c);
}
for (var i = ; i < root.childCount; ++i)
{//方式三,删不干净,会有一些剩余节点,只删除了偶数节点0,2,4,6,剩余奇数节点1,3,5,7
var c = root.GetChild(i).gameObject;
GameObject.DestroyImmediate(c);
}
while (root.childCount > )
{//方式四,正确删除所有子结点
var c = root.GetChild().gameObject;
GameObject.DestroyImmediate(c);
}
for (int i = go.childCount - 1; i >= 0; i--) {//方式五,正确删除所有子结点
GameObject.DestroyImmediate(go.GetChild (i).gameObject);
}
}
UNITY Destroy()和DestroyImadiate()的区别的更多相关文章
- UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存
如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null.这是UNITY内部的一个处理技巧.关于这个技巧有很争 ...
- Unity 游戏对象消失 enable,destroy与active的区别
gameObject.SetActive(false):是否在场景中停用该物体,停用后Hierarchy窗口呈灰色,用Find函数也找不到.如果该物体有子物体,要用SetActive Recursir ...
- 转载:Unity3D游戏对象消失enabled、Destroy与active的区别
转自:http://www.manew.com/3276.html Unity3D游戏对象消失三种方法的区别: gameObject.active:是否在场景中停用该物体,在你gameObject.a ...
- unity, destroy gameObject & destroy all children
一,destroy gameObject 删除名为xxx的gameObject 错误方法1: Destroy(xxx); 以上方法之所以错误,是因为Destroy在下一帧才生效,而在本帧之内xxx还存 ...
- unity, Destroy注意事项
Destroy不是立即发生作用,而是推迟到帧末,所以下面代码是错误的: void OnTriggerEnter(Collider other){ if (other.gameObject.tag ...
- Unity Destroy和DestroyImmediate
Destroy(Object obj, float t = 0.0F); 删除一个游戏对象,组件或者资源. 物体obj现在被销毁或在指定了t时间过后销毁.如果obj是组件,它将从GameObject销 ...
- Unity之Update与FixedUpdate区别
下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : MonoBehaviour ...
- Unity中 Animator 与Animation 区别
①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的.Animation 控制一个动画的播放,而Animator是多个动画之间相互切换,并且Anima ...
- Unity碰撞和触发的区别
碰撞的必要条件: 2个都有Collider,且至少有一个刚体.带刚体的身上会检测OnCollision事件,stay就是2个一直在碰着. 触发的必要条件: 至少有一个碰撞器勾选了IsTrigger,至 ...
随机推荐
- svn版本管理与上线
1.1 SVN介绍 1.1.1 什么是SVN(Subversion)? Svn(subversion)是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统 ...
- Alpha阶段第1周 Scrum立会报告+燃尽图 02
作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...
- 用于调试的printf函数和自定义log函数
1. 用宏定义调试用的DPRINT #define DEBUG_ENABLE #ifdef DEBUG_ENABLE #define DPRINT(fmt, args...) fprintf(stde ...
- Android 平台代号、版本、API 级别和 NDK 版本
代号.标记和细分版本号 简要来说,Android 的开发是围绕着版本系列进行的,这些版本使用美味的点心名字(按字母顺序)作为代号. 平台代号.版本.API 级别和 NDK 版本 为方便起见,代号与以下 ...
- 重写ajax方法实现特定情况下跳转登录页面
jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _suc ...
- Oozie_01安装教程【20161116】
说明:hadoop用的是hadoop-2.5.0-cdh5.3.6 Oozie用的是oozie-4.0.0-cdh5.3.6 该测试环境用户名为hadoop 主机名为hadoop01 2.4安装部署 ...
- [UOJ46][清华集训2014]玄学
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...
- 我的AOP那点事儿--2
在<我的AOP那点事儿-1>中,从写死代码,到使用代理:从编程式AOP到声明式AOP.一切都朝着简单实用主义的方向在发展.沿着 Spring AOP 的方向,Rod Johnson(老罗) ...
- ACCESS_TOKEN与FRESH_TOKEN
OAuth1.0中的access_token过期时间通常很长,安全性差.于是OAuth2.0推出了refresh_token. OAuth2.0中,客户端用账户名,密码经过一定方式(比如先请求code ...
- js中setAttribute 的兼容性
js中setAttribute 的兼容性class和className兼容方法: object.setAttribute("class","content") ...