# オブジェクト

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

`UnityEngine.Object` クラスは、Unity エディターで参照できるすべてのオブジェクトの基本クラスです。`UnityEngine.Object` から継承したクラスを Inspector のフィールドにドラッグアンドドロップするか、オブジェクトフィールドの横にあるオブジェクトピッカーを使用して選択できます。


**Inspector ウィンドウのオブジェクトフィールドの例。オブジェクトピッカーは、フィールドの右側にある丸いアイコンです。:**
![](/api/media?file=/engine/6000.0/media/images/ExampleObjectField.png)

通常は、独自のカスタムクラスの `Object` から直接継承するよりも、目的に合わせて設計されたクラスから継承します。 例:

* 例えば、`GameObject` に追加して、`GameObject` の動作を制御したり関連する機能を提供したりするカスタムコンポーネントを記述したい場合は、`MonoBehaviour` を継承します。
* シリアル化されたデータを保存できるカスタムアセットを作成したい場合は、`ScriptableObject` を継承します。

これらはどちらも `UnityEngine.Object` を継承していますが、目的に合わせて追加の機能を提供します。

**ノート:** `UnityEngine.Object` は .NET の基本クラスである `System.Object` とは異なります。名前が競合しないようにデフォルトのスクリプトテンプレートには含まれていません。ただし、Inspector で割り当てる必要のないクラスを作成したい場合は、.NET の `System.Object` を継承できます。

`Object` クラスは、オブジェクトをインスタンス化および破棄するためのメソッドや、特定の型のオブジェクトへの参照を検索するためのメソッドを提供します。Object クラスの API の詳細は、[Object のスクリプトリファレンス](/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 は現在、`UnityEngine.Object` のインスタンスでの C# `WeakReference` クラスの使用をサポートしていません。そのため、ロードされたアセットの参照に `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 はほとんどの型のネイティブの対応するオブジェクトを再作成します。この再作成動作の 2 つの例外は、[MonoBehaviour](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) と [ScriptableObjects](/engine/6000.0/script-reference/unity-engine/scriptable-object.md) です。これらは一度破棄されると、リロードできません。

`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)
