博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity】Destroy和DestroyImmediate的区别
阅读量:4085 次
发布时间:2019-05-25

本文共 1343 字,大约阅读时间需要 4 分钟。

情景:有一个父物体A,A有子物体B1.B2.B3……B10等10个子物体

那么现在若想移除B1—B10,该如何?
我能想到的最简单是这样做

using UnityEngine;      using System.Collections;      ///       /// 脚本位置:将此脚本挂载到父物体A身上      /// 脚本功能:用于测试销毁所有子物体      ///       public class Parent : MonoBehaviour      {          void Start ()          {              for (int i = 0; i < transform.childCount; i++) {                  Destroy (transform.GetChild (i).gameObject);              }          }      }
  • 第一眼看下去,好像没什么不对,粘贴到工程里试一试,也OK

    没错,这段程序没有问题的,但是不知道大家有没有注意
    Destroy里面的GetChild(i)为什么是i呢,i是不是从0到9?
    没错,i从0开始,i++肯定是一直递增的,但是它能不能加到9就是另外一回事了
    因为这取决于transform.childCount的值

  • 运行测试之后,所有子物体确实已经销毁,打印输出i的值,是0—9

    那么这一切都说明,当我们使用Destroy销毁物体的时候,程序不能立刻检测到这个物体被销毁了,所以获取子物体数量的时候,依然获取到的是有10个子物体

  • 所以,这个时候使用Destroy销毁对象的时候不是我们想象的那个样子

    我们想象的是什么样子?你怎么知道我在想什么

  • List大家应该都比较熟悉,当List中有10个对象的时候,如果RemoveAt掉了第0个,那么后面的9个对象都会向前移动,只要执行10次RemoveAt(0)那么就会清空List

  • 但是被Destroy的游戏对象不会发生类似List中移除对象的情况,销毁了第0个子物体,第1个子物体还在原来的位置,程序不能立即检测到到它被销毁了,需要过几帧之后才能检测到

如果想实现List一样的效果,那么需要使用DestroyImmediate这个方法

代码就变成这个样子

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

最后,官方推荐使用Destroy代替DestroyImmediate

原因是DestroyImmediate是立即销毁,立即释放资源,做这个操作的时候,会消耗很多时间的,影响主线程运行

Destroy是异步销毁,一般在下一帧就销毁了,不会影响主线程的运行。

转载地址:http://jbkii.baihongyu.com/

你可能感兴趣的文章
《多旋翼无人飞行器嵌入式飞控开发指南》里基于FreeRTOS的无人机软件框架
查看>>
思岚A1的SDK其实很好读懂,每个函数清晰明了,可以直接调用
查看>>
pixhawk(PX4)的一些论坛网站(包括中文版的PX4用户手册和PX4开发手册)
查看>>
串级 PID 为什么外环输出是内环的期望?(和我之前对串级PID的总结一样)
查看>>
我刚刚才完全清楚GPS模块的那根杆子是怎么固定安装好的
查看>>
去github里面找找也没有别人无人机+SLAM的工程
查看>>
PX4与ROS关系以及仿真控制(键盘控制无人机)
查看>>
我对无人机重心高度的理解
查看>>
现在明白为什么无名博客里好几篇文章在讲传感器的滞后
查看>>
实际我看Pixhawk定高模式其实也是飞得很稳,飘得也不厉害
查看>>
Pixhawk解锁常见错误
查看>>
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>