Version: 6000.3
语言: 中文
基本 Unity 类型
单一行为

对象

切换到脚本

UnityEngine.Objectclass 充当 Unity 可以在 Unity 编辑器中引用的所有对象的基类。您可以拖放继承自UnityEngine.Object检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表
,或使用“对象”字段旁边的“对象选取器”进行拾取。

“检查器”窗口中的对象字段示例。对象选择器是字段右侧的圆形图标。
“检查器”窗口中的对象字段示例。对象选择器是字段右侧的圆形图标。

而不是直接从Object对于您自己的自定义类,通常最好从设计为更具体地针对您的目标的类继承。例如:

  • 继承自MonoBehaviour如果您想编写一个自定义组件,您可以将其添加到GameObject,以控制GameObject做或提供与之相关的一些功能。
  • 继承自ScriptableObject如果要创建可以存储序列化数据的自定义资产。

这两个都继承自UnityEngine.Object但提供额外的功能来满足这些目的。

注意: UnityEngine.Object与 不同。NET 的基础System.Object,该模板不包含在默认脚本模板中,因此名称不会冲突。您仍然可以继承 。NET 的System.Object如果您想创建不需要在检查器中分配的类。

Objectclass 提供了用于实例化和销毁对象以及查找对特定类型对象的引用的方法。有关 Object 类的 API 的更多信息,请参阅 Object 的脚本参考页面

UnityEngine.Object 的特殊行为

UnityEngine.Object是 Unity 中一种特殊类型的 C# 对象,因为它链接到非托管 (C++) 对应对象。例如,当您使用相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
请参阅术语表
组件,Unity 将对象的状态存储在对象的 C++ 对应项上,而不是 C# 对象本身。

两个并排的容器代表 Unity 引擎的非托管层和托管层。每个容器都有自己的 UnityEngine.Object 表示形式。两层之间的连接线演示了托管对象实例与其非托管对象实例之间的链接。
两个并排的容器代表 Unity 引擎的非托管层和托管层。每个容器都有自己的 UnityEngine.Object 表示形式。两层之间的连接线演示了托管对象实例与其非托管对象实例之间的链接。

Unity 目前不支持 C#WeakReference类,实例为UnityEngine.Object.因此,您不应该使用WeakReference以引用已加载的资产。Microsoft有关WeakReference类。

Unity C# 和 Unity C++ 共享 UnityEngine 对象

使用 Object.DestroyObject.DestroyImmediate 等方法销毁派生自UnityEngine.Object,Unity 会销毁(卸载)C++ 对应对象。不能使用显式调用销毁 C# 对象,因为垃圾回收器管理内存。一旦不再有对托管对象的任何引用,垃圾回收器就会收集并销毁它。

如果您的应用程序尝试访问已销毁的UnityEngine.Object同样,Unity 为大多数类型重新创建了原生对应对象。这种重新创建行为的两个例外是 MonoBehavioursScriptableObjects:一旦它们被销毁,Unity 就永远不会重新加载它们。

自定义 == 运算符

对于继承自 UnityEngine.Object 的类型,Unity 使用 C# 相等和不等式运算符的自定义版本。这意味着空检查myGameObject == null可以评估true(反之亦然myGameObject != null可以评估false),即使myGameObject从技术上讲,保存有效的 C# 对象引用。这发生在两种情况下:

  1. 该对象可以是所谓的假 null 或占位符对象,Unity 在编辑器中仅用于填充未初始化的 MonoBehaviour 字段。这些对象存储有用的调试信息,以帮助您在尝试引用这些字段时找到它们的源。
  2. 该对象可以是尚未垃圾回收的托管 (C#) 对象,但应将其视为 null,因为非托管 (C++) 对应对象已被销毁。

因为你不能重载???.运算符,它们与派生自UnityEngine.Object.当您在销毁的运算符上使用它们时,它们不会返回与相等和不等式运算符相同的结果MonoBehaviourScriptableObject而托管对象仍然存在。

其他资源

基本 Unity 类型
单一行为