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,至 ...
随机推荐
- windows下mysql多实例安装
在学习和开发过程中有时候会用到多个MySQL数据库,比如Master-Slave集群.分库分表,开发阶段在一台机器上安装多个MySQL实例就显得方便不少. 在 MySQL教程-基础篇-1.1-Wind ...
- Python IDE集成开发工具
Python IDE集成开发工具 Python IDE 本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Pytho ...
- Beta阶段第2周/共2周 Scrum立会报告+燃尽图 09
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2389] 版本控制:https://git.coding.net/liuyy08 ...
- .properties文件常量定义
application.properties文件,位于resources目录下.一般定义一些不会改变的数据如数据库相关配置,文件路径,项目地址. 如何在项目代码中获取该文件中的配置信息: 1,在app ...
- 深入__proto__和prototype的区别和联系
前话 有一个一个装逼的同事,写了一段代码 function a(){} a.__proto__.__proto__.__proto__ 然后问我,下面这个玩意a.__proto__.__proto__ ...
- C# 实现网络时间同步功能
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- linuxkit 基本试用
安装 linux go get -u github.com/linuxkit/linuxkit/src/cmd/linuxkit mac brew tap linuxkit/linuxkit brew ...
- CSS为英文和中文字体分别设置不同的字体
font-family的调用方法: div { font-family:Arial,'Times New Roman','Microsoft YaHei',SimHei; font:bold 12px ...
- angularJS的ng-repeat-start
使用angularJS的同学对ng-repeat都不会陌生,他是用来进行数据循环的,一般用于数组或者对象.但是今天我们用到了一个ng-repeat-start. ng-repeat-start,与ng ...
- 再记录一次delete出错的经历
调试的时候进行到delete语句时出现问题,我做的操作是在函数体内用int*申请了N个内存空间,这让我十分纳闷,为什么不能delete呢? 回忆到之前delete出错也遇过一次问题 手动封装OpenC ...