销毁方式

销毁物体的方式有两种:Destroy和DestroyImmediate两种,那两者有什么区别呢?细听分说。

两种方式都能达到销毁物体的目的,有以下区别:

Destroy销毁场景中的物体但是内存还存在,或一段时间没有再次被使用,才会销毁并且释放内存,这样避免了频繁对内存的读写操作,系统回收器会定时清理内存中没有被引用的对象,很可能有些地方你依然引用了该对象在你自己都不知道的地方,或者你忽略的地方,直接销毁会导致引用地方出现空引用的引用错误。

DestroyImmediate则是立即销毁对象,并从内存中移除掉。

例子

比如说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体

 ///<summary>
///脚本挂在A物体上
/// <summary>
public class AGameOnject: MonoBehaviour
{ void Start ()
{
for (int i = ; i < transform.childCount; i++) {
Destroy (transform.GetChild (i).gameObject);
}
} }

通过以上代码就可实现销毁了A下所有子物体,但是有些人会有疑问,为什么这个地方是GetChild(i),每删除一个后面的物体不应该向前移吗?索引会减一的。

所以这就是Destroy的机制,在执行了Destroy后,程序并不能立即检测到该物体被销毁了获取数量是依然是10个。

但如果是DestroyImmediate就不能这样写了,如下:

 public class AGameObject : MonoBehaviour
{ void Start ()
{
int count = transform.childCount;
for (int i = ; i < count; i++) {
DestroyImmediate (transform.GetChild ().gameObject);
} }
 }  

因为DestroyImmediate 一执行就会立即销毁,并释放内存,数量就会减一,后面的物体的索引就会向前移动。

总结

DestroyImmediate 一旦销毁就会立即销毁,并释放内存。执行这个操作需要消耗更多时间,影响主线程进行,而Destroy是异步销毁,一般在下一帧就会销毁,不会影响主线程的进行。

欢迎指正。

Unity中销毁游戏对象的方式的更多相关文章

  1. Unity中制作游戏的快照游戏支持玩家拍快照

    Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...

  2. Unity关于获取游戏对象

    我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...

  3. Unity中的万能对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...

  4. unity3d通过代码动态创建销毁游戏对象

    只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...

  5. 值得收藏!!javascript数组中多条对象去重方式,很实用!!!

    在数组中都是数字的时候很好去重,例如:var  arr=[1,2,2,2,3,4,5,4,5,3,6]:可以用两层for循环或者其他方式进行去重 我在这里也给出一个方法吧: Array.prototy ...

  6. Django中构造响应对象的方式

    1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象. HttpResponse(content=响应体, content_type=响应体数据类型, ...

  7. UGUI 用手柄或者键盘控制选择Scroll View中的游戏对象时,滚动条跟着移动

    原预制体以及脚本的下载地址:https://download.csdn.net/download/qq_15017279/10404010 1.新建一个Scroll View,删掉横向的滚动条,并且把 ...

  8. 在Unity中json文件的解析方式

    using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; using ...

  9. Unity塔防游戏开发

    Unity3D塔防开发流程 配置环境及场景搭建编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG More开发工具:Unity3D编辑器.Visual Studio编译器开发建议:了解Uni ...

随机推荐

  1. 静态栈-------C语言

    /***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...

  2. C++之string面试问题

    1.指针变量指向字符串常量的问题 代码如下: "; 问p[0]=2;是否可以?原因? 答案:不可以.“123456”是字符串常量,存储在常量区,其值不可更改. 2.sizeof求字符串长度问 ...

  3. 拾遗:Docker 基本应用

    https://wiki.gentoo.org/wiki/Docker 检查内核内核选项 exec /usr/share/docker/contrib/check-config.sh 使用 btrfs ...

  4. Ibatis sql语句1

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...

  5. ArcGis基础——Excel表格插入ArcMap布局视图,记录显示不全的替代解决方法

    前几天帮朋友处理了这样一个问题 Excel有200余行记录,插入到ArcMap布局视图,只能显示100行左右. 解决思路 ArcMap要素类的属性表可以插入到布局视图,可否把Excel挂接到要素类的属 ...

  6. 软工-五月心得体会 PB16110698

    伴随着愈发红润的骄阳,火热而紧张刺激的五月悄然而至.这一个月以来,曾经让同学们“废寝忘食”的软工课大作业终于告一段落,每周一篇的读书笔记也缓到半月一篇,着实令人长吐一口气.但这一份表面的余裕当然没有看 ...

  7. Linux 进程间通信 有名管道(fifo)

    有名管道特点: 1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围 2)有名管道可以使互不相关的两个进程互相通信. 3)有名管道可以通过路径名来指出,并且在文件系统中可见,但内容 ...

  8. fedora 28 missing PROG bison

    yum install bison Missing PROG dlltool Missing PROG flex Missing PROG mt

  9. Linux下安装.NETCore3.0

    今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0  :https://dotnet.microsoft.com/download/dotnet-core/ ...

  10. es6学习(一)

    之前一直听说es6,断断续续看过阮一峰老师的"ECMAScript 6 入门",觉得写得很好,但由于实际项目中没用到,所以并没有过多的去研究(人的惰性在我这里表现的淋漓尽致).直到 ...