IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> [Unity] 关于UnityEngine.Object的fake null -> 正文阅读

[游戏开发][Unity] 关于UnityEngine.Object的fake null

看一段代码:

Object a = new Object();
Debug.Log(a);
var b = a;
Debug.Log(b);
DestroyImmediate(a);
Debug.Log(b);

输出为三个null
当然一开始a 和 b 不应该是null。这儿输出为null只是因为它们指向的object的ToString()返回"null"而已。
同样如果使用 == 或 != 去比较 a,也会得到a指向null的假象。在Unity的逻辑中,这个没啥用的空Object就是null。
然后把上面的Object换成GameObject再看一下:

GameObject a = new GameObject();
Debug.Log(a);
var b = a;
Debug.Log(b);
DestroyImmediate(a);
Debug.Log(b);

这次前面两个log输出正常的对象字符串表示,而最后一个Log输出null。原因和上面一样。只是一开始GameObject没有被视为null,只有当Destroy之后,才被视作null。但是这给你一个假象:当多个引用指向同一个GameObject时,如果该GameObject被Destroy,则所有指向它的引用都被置为null。多么神奇的操作啊!在c++中应该是产生一堆野指针。而在c#这种使用GC的语言中,我们其实并不能主动去"Destroy"一个对象,只能把所有的引用都置为null,最终通过GC来释放对象。但是Unity搞了一个神奇的操作,通过Destroy把对象的内部状态设置为null(所谓的fake null),然后通过重载 ==, !=, ToString()等操作符和函数,让外部认为所有指向这个对象的引用是指向null。那么这样的对象,什么时候真正被从堆上删除呢?我猜是GC扫描的时候,fake null同样起作用,对垃圾回收器说我是空对象,来收我啊。。

那么这样好吗?
首先,这么做很Unity,非常符合Unity的设计哲学。为了游戏不容易崩溃,降低编程门槛,开辟更大的市场,Unity这么做已经成功了。但是这么做也有隐患。比如把最后一句Log改成这样:
Debug.Log(b?.name);
这会产生一个异常:MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
因为?.操作是真的在比较引用,如果引用存在就会执行.name。虽然Unity想各种方法让引用看起来是null,但是这儿并不起作用。
那么我们应该怎么做更好?我觉得不能依赖于Unity的fake null功能,如果对象被Destroy,该置空的引用应该手动置空,这样更安全,而且也容易养成好的编程习惯,这样在你迁移到非Unity平台之后,才不至于出问题。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 18:01:25  更:2021-12-16 18:03:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:06:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码