浅析NGUITools.DestroyImmediate和NGUITools.Destroy的区别

本文探讨了在Unity中使用NGUITools.DeleteImmediate()导致安卓设备游戏卡死的问题,并对比了NGUITools.Destroy()和Unity自带的Destroy()及DestroyImmediate()函数的区别。文章提供了在不同平台上选择合适删除方法的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做项目的时候用到了NGUITools.DestroyImmediate()来做一些删除操作.这可把我害惨了......

当时的情况,看代码....


这个是加了判断条件了的,之前只有第35行.在电脑上(也就是编辑状态下)运行是OK的,但是打包apk到安卓手机上运行的时候一到这个地方就整个游戏卡死了.

先看下NGUITools的这个两个函数的定义:


可以看出来,NGUITools.Destroy()的概要,在编辑模式下会立即删除指定的物体,如果是在播放器下且删除的是gameObject对象还多了一些操作,

大概来说就是编辑模式下会用NGUITools.DestroyImmediate(),播放模式(包括安卓、苹果设备)会用NGUITools.Destroy().

但是我现在在编辑模式下用NGUITools.DestroyImmediate()和NGUITools.Destroy()都没事,在播放模式下调用NGUITools.DestroyImmediate()的时候就会卡死,看着

NGUITools.DestroyImmediate()里边的源代码在那种情况的话会调用的是Unity里边的Destroy()函数,而使用NGUITools.Destroy()的话除了多了一些操作,依然会调用

unity中的Destroy()。

而更加奇怪的是:

如果直接调用的是unity中的Destroy()会导致在编辑状态下都会卡死,而用DestroyImmediate()就可以运行.

再看看unity手册对这两个函数的解释:

Destroy():

物体obj现在被销毁或在指定了t时间过后销毁。如果obj是组件,它将从GameObject销毁组件component。如果obj是GameObject它将销毁GameObject全部它的组件和GameObject全部transform子物体。实际物体的销毁总是延迟到当前更新循环后,但总是渲染之前完成。

DestroyImmediate():

该函数只在写编辑器代码时使用,因为延时的销毁永远不会在编辑模式下调用。在游戏代码推荐使用Object.Destroy代替。销毁总是延迟的(但在同一帧内执行),小心使用该函数,因为它能永久销毁资源。



这样我之前直接调用unity的Destroy()造成卡死的现象就可以解释了,因为延迟嘛,编辑模式不会调用.


现在最疑惑的是NGUITools.DestroyImmediate()和NGUITools.Destroy()这两个函数在封装的时候都做过判断,所以在编辑模式下用NGUITools.Destroy()是OK的;但是在手机中用NGUITools.DestroyImmediate()就不行.



总结我遇到的情况以及对应的解决方法;

NGUITools.DestroyImmediate()和NGUITools.Destroy()在编辑模式游戏都可以正常运行,NGUITools.DestroyImmediate()在安卓设备下游戏卡死.

解决:针对不同平台用不同的方法(主要根据手册中的编辑模式下用DestroyImmediate(),设备中用NGUITools.Destroy())


unity的DestroyImmediate()和Destroy(),编辑模式用Destroy()游戏会崩掉,所以用DestroyImmediate(),设备中也是用DestroyImmediate().


具体的原因还没有找到,希望有了解内情的可以告诉我!!!!!感激不尽!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值