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,至 ...
随机推荐
- 1元抢卡巴KAV_不限量疯抢即日起至2013.10.31截止
活动地址:http://img.kaba365.com/mail_files/kaba1yuan.html
- CentOS安装Zabbix
rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm使用MySQL数据库 ...
- I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard-android.sh hacking
#!/bin/bash # 参考文章: # . Shell特殊变量:Shell $, $#, $*, $@, $?, $$和命令行参数 # http://c.biancheng.net/cpp/vie ...
- JSP--JDBC技术
JDBC技术1.JDBC简介 大型网站是离不开数据库的,使用JDBC技术链接数据库 JDBC:java Data Base Connectivity,使用JDBC连接数据库后数据库的增/删/改/查及批 ...
- Linux中epoll+线程池实现高并发
服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...
- FastAdmin 开发时如何与官方同步升级
FastAdmin 开发时如何与官方同步升级 使用 FastAdmin 开发时为了与官方同步升级,推荐使用 git 管理代码. 官网上提供的完整包是为了方便第一次使用的人快速测试. 我一般是给官方的 ...
- mysql 源代码目录及安装目录介绍
1.源代码目录介绍: 1.BUILD BUILD目录是编译.安装脚本目录,绝大部分以compile-开头,其中的SETUP.sh脚本为C和C++编译器设置了优化选项.2.client cl ...
- BZOJ1252:序列终结者
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- 解决hue查询中文报错问题
hue 4.0查询查询中包含中文报一下错误 (1366, Incorrect string value: \\xE4\\xBA\\xAC\\xE4\\xB8\\x9C... for column se ...
- security自动登陆
package*.security; import java.util.ArrayList; import javax.servlet.http.Cookie; import javax.servle ...