# 对象

> UnityEngine.Object is the base class for all objects the Editor can reference from fields in the Inspector window.

`UnityEngine.Object` 类用作 Unity 可以在 Unity 编辑器中引用的所有对象的基类。可将继承自 `UnityEngine.Object` 的类拖放到 Inspector 中的字段中，或使用“对象 (Object)”字段旁边的 Object Picker 进行选取。


**Inspector 窗口中的“对象 (Object)”字段示例。Object Picker 是字段右侧的圆形图标。:**
![](/api/media?file=/engine/6000.0/media/images/ExampleObjectField.png)

一般而言，继承自专为目标设计的类会更好，而不是直接从自定义类的 `Object` 继承。例如：

* 如果您想编写可以添加到 `MonoBehaviour` 的自定义组件，应继承自 `GameObject`，以控制 `GameObject` 的功能或提供与其相关的某些功能。
* 如果您想创建可以存储序列化数据的自定义资源，应该继承自 `ScriptableObject`。

二者都继承自 `UnityEngine.Object`，但提供了额外的功能来满足这些目的。

**注意：**`UnityEngine.Object` 与 .NET 的基本 `System.Object` 不同，后者不包含在默认脚本模板中，因此名称不会冲突。如果您想创建不需要在 Inspector 中分配的类，仍然可以从 .NET 的 `System.Object` 继承。

`Object` 类提供了用于实例化和销毁对象以及查找对特定类型对象的引用的方法。有关 Object 类的 API 的更多信息，请参阅[对象的脚本参考页](/engine/6000.0/script-reference/unity-engine/object.md)。

## UnityEngine.Object 的特殊行为

`UnityEngine.Object` 是 Unity 中的一种特殊类型的 C# 对象，因为它链接到非托管 (C++) 对应对象。例如，使用[摄像机 (Camera)](/engine/6000.0/script-reference/unity-engine/camera.md) 组件时，Unity 会将对象的状态存储在对象的 C++ 对应项上，而不是存储在 C# 对象本身上。


**Frame:**
![](/api/media?file=/engine/6000.0/media/images/unity-engine-object.png)

Unity 目前不支持将 C# `WeakReference` 类与 `UnityEngine.Object` 实例结合使用。因此，不应使用 `WeakReference` 来引用加载的资源。有关 `WeakReference` 类的更多信息，请参阅 Microsoft 的 [WeakReference 文档](https://docs.microsoft.com/en-us/dotnet/api/system.weakreference?view=netcore-3.1)。

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

使用 [Object.Destroy](/engine/6000.0/script-reference/unity-engine/object/destroy.md) 或 [Object.DestroyImmediate](/engine/6000.0/script-reference/unity-engine/object/destroy-immediate.md) 等方法来销毁从 `UnityEngine.Object` 派生的对象时，Unity 会销毁（卸载）C++ 对应对象。无法使用显式调用销毁 C# 对象，因为垃圾回收器会管理内存。一旦不再引用托管对象，垃圾回收器便会收集并销毁它。

如果再次访问已销毁的 `UnityEngine.Object`，则 Unity 会为大多数类型重新创建原生对应对象。此重新创建行为的两个例外是 [MonoBehaviours](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) 和 [ScriptableObjects](/engine/6000.0/script-reference/unity-engine/scriptable-object.md)：它们一旦被销毁，Unity 便绝不会重新加载它们。

`MonoBehaviour` 和 `ScriptableObject` 会覆盖相等 (==) 和不相等 (!=) 运算符。如果将销毁的 `MonoBehaviour` 或 `ScriptableObject` 与 `null` 进行比较，则当托管对象仍然存在且尚未进行垃圾收集时，运算符会返回 true。

由于无法重新加载 ?? 和 ?. 运算符，因此它们与派生自 `UnityEngine.Object` 的对象不兼容。在托管对象仍然存在的情况下对销毁的 `MonoBehaviour` 或 `ScriptableObject` 进行使用时，这些运算符不会返回与相等和不相等运算符相同的结果。

## 其他资源

* [Null 参考](/engine/6000.0/manual/scripting/object-oriented-development/null-reference-exception.md)
* [UnityEngine.Object API 参考](/engine/6000.0/script-reference/unity-engine/object.md)
