版本: Unity 6 (6000.0)
语言 : 英语
Unity 基本类型
游戏对象

对象

切换到脚本编写

UnityEngine.Object 类充当 Unity 在 Unity 编辑器中可以引用的所有对象的基类。您可以将继承自 UnityEngine.Object 的类拖放到 检视器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。 更多信息
查看 词汇表
中的字段,或使用对象字段旁边的对象选择器来选择它们。

An example of an Object Field in the Inspector window. The Object Picker is the circular icon to the right of the field.
检视器窗口中对象字段的示例。对象选择器是字段右侧的圆形图标。

对于您自己的自定义类,与其直接继承自 Object,不如继承自更适合您的目标的类。例如

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

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

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

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

UnityEngine.Object 的特殊行为

UnityEngine.Object 是 Unity 中一种特殊类型的 C# 对象,因为它与一个非托管 (C++) 对应对象相关联。例如,当您使用 相机一个组件,它创建场景中特定视点的图像。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
查看 词汇表
组件时,Unity 将对象的 state 存储在对象的 C++ 对应对象上,而不是 C# 对象本身。

Unity 目前不支持使用 C# WeakReference 类与 UnityEngine.Object 的实例一起使用。因此,您不应该使用 WeakReference 来引用已加载的资产。有关 WeakReference 类的更多信息,请参阅 Microsoft 的 WeakReference 文档

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

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

如果您的应用程序尝试再次访问已销毁的 UnityEngine.Object,Unity 将为大多数类型重新创建本机对应对象。此重新创建行为的两个例外是 MonoBehavioursScriptableObjects:Unity 永远不会在它们被销毁后重新加载它们。

MonoBehaviourScriptableObject 覆盖了相等 (==) 和不相等 (!=) 运算符。如果您将已销毁的 MonoBehaviourScriptableObjectnull 进行比较,当托管对象仍然存在且尚未被垃圾收集时,运算符将返回 true。

由于您无法重载 ?? 和 ?. 运算符,因此它们与派生自 UnityEngine.Object 的对象不兼容。当您对已销毁的 MonoBehaviourScriptableObject 使用这些运算符时,它们不会返回与相等和不相等运算符相同的结果,而托管对象仍然存在。

其他资源

Unity 基本类型
游戏对象