当前位置: 首页 > 工具软件 > until-destroy > 使用案例 >

Unity中的Destroy和null 问题

寿意远
2023-12-01

Unity中的Destroy和null 问题

Unity中,我们经常需要销毁物体,Unity也给我们提供了销毁的API。
Destroy( )和 DestroyImmediate( );
这两种都可以进行销毁,但是还是有一定的区别,同时还是要注意使用的坑点。
在QQ群看到,好多人还是对这些不太清楚,所以花时间来重新学习和验证一下。

官方API文档

Destroy
https://docs.unity3d.com/ScriptReference/Object.Destroy.html
DestroyImmediate
https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html

采坑注意

关键正常的使用就不单独进行讲解了,自己看一下官方的文档或者网上找个博客看看就行了。
这里重点说一下使用中遇到的坑的问题。
在开发中我们经常会有需求,需要判断是否成功的销毁对象。

我们经常会用一个 if(gameObject) 这种方式去判断是否为对象已经被销毁,
if(gameObject) 等价于 if (gameObject == null )
if(gameObject) 这种写法可能平时都用过,但是并没有想过为什么可以这样。
抽时间再单独写一下这个。

Destroy API既可以销毁物体也可以销毁组件。
举例来看一下这里边的坑。下边的代码工程文末会附带链接。

 Destroy(CubeGameObject);

 Debug.Log(CubeGameObject);

 DestroyImmediate(CubeGameObject);

 Debug.Log(CubeGameObject);

运行的输出结果
第一次成功打印对象
第二次打印结果为null

也就是说结果第一种方式并没有立即释放掉内存。
网上有很多乱七八糟的猜测,这里我们直接看官方文档即可得出结果。
Destroy
Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering.
上边是官方的原话 实际上对象的销毁要当前Update循环之后,并且在渲染之前。在同一帧内执行 但是会延迟

DestroyImmediate
Destroys the object obj immediately. You are strongly recommended to use Destroy instead.
立即销毁对象。强烈建议使用Destroy替代。官方下边还有一些使用的注意事项
我在PC项目上使用过这个没有出过什么问题。

如果你想要在删除后,立马判断它的状态,name你应该使用DestroyImmediate来进行删除。

关于obj == null的问题

网上有说法是关于下边这种情况的讨论

 GameObject go = new GameObject();
 Object obj = new Object();
 Debug.Log("go == null   "+(go == null));
 Debug.Log("obj == null   " + (obj == null));

测试结果为 false true。
这个问题不是什么==重写的问题,这个有空在讨论。
直接查看官方的Object类文档
https://docs.unity3d.com/ScriptReference/Object-operator_eq.html

Instatiating a GameObject adds it to the scene so it’s completely initialized (!destroyed).
Instantiating a simple UnityEngine.Object has no such semantics, so the it stays in the ‘destroyed’ state which compares true to null.

这段话的意思是 建立一个游戏对象添加到场景中,这个对象是完全被建立的(分配了内存空间)
建立一个简单的UnityEngine.Object 对象是没有明确的语义的,(也是就是说不明确的制定,Object是基类,可以这么理解,你只说了我要一个东西,却不知道要什么东西,所以系统也就没办法去给你分配东西)
所以它的存在是相当于 销毁状态的(也就是null的状态)。所以上边第二个结果就是返回true了,这个是一个特殊的情况。

测试工程

链接: https://pan.baidu.com/s/1fHPPX0QgrhPN0uY36a2R-Q 密码: ieqx

 类似资料: