Unity中销毁游戏对象的方式
销毁方式
销毁物体的方式有两种: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中销毁游戏对象的方式的更多相关文章
- Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...
- Unity关于获取游戏对象
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...
- Unity中的万能对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...
- unity3d通过代码动态创建销毁游戏对象
只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...
- 值得收藏!!javascript数组中多条对象去重方式,很实用!!!
在数组中都是数字的时候很好去重,例如:var arr=[1,2,2,2,3,4,5,4,5,3,6]:可以用两层for循环或者其他方式进行去重 我在这里也给出一个方法吧: Array.prototy ...
- Django中构造响应对象的方式
1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象. HttpResponse(content=响应体, content_type=响应体数据类型, ...
- UGUI 用手柄或者键盘控制选择Scroll View中的游戏对象时,滚动条跟着移动
原预制体以及脚本的下载地址:https://download.csdn.net/download/qq_15017279/10404010 1.新建一个Scroll View,删掉横向的滚动条,并且把 ...
- 在Unity中json文件的解析方式
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; using ...
- Unity塔防游戏开发
Unity3D塔防开发流程 配置环境及场景搭建编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG More开发工具:Unity3D编辑器.Visual Studio编译器开发建议:了解Uni ...
随机推荐
- 将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
- mongodb入门篇
MongoDB 入门篇 分类: NoSQL, 故障解决 undefined 1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data) ...
- 结对编程UI
GitHub:https://github.com/zsl1996/UI/commits/master 一. 实验内容 这是交付给最终用户的软件,有一定的界面和必要的辅助功能.完 ...
- float f=3.4;是否正确?
float f=3.4;是否正确? 不正确.3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 ...
- 传输文件到docker容器
传输文件到docker容器 首先需要知道docker容器的container_id,可以使用docker ps命令来查看你要操作的docker容器的container_id Docker容器向宿主机传 ...
- CSS3(@media)判断手机横竖屏
@media all and (orientation : landscape) { h2{color:red;}/*横屏时字体红色*/ } @media all and (orientation : ...
- DOM 对象和jQuery对象的转换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java KMP算法代码
1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...
- .net Core之【区域】路由配置
1.创建项目 现在的项目是比较干净的 2.创建一个区域 创建完成后,会出现一个页面,人家都说了怎么设置路由规则 3.进入Startup.cs文件中添加红色代码 app.UseMvc(routes =& ...
- 自定义Java annotation
1.目录结构: 2.pom文件: Simple exmple: package com.yuan.simple; import java.lang.annotation.Retention; impo ...