Объект
UnityEngine.Object класс служит базовым для всех объектов, на которые Unity может ссылаться в редакторе. Классы, наследующие UnityEngine.Object в поля в Inspector, или выбрать их с помощью Выборщика объектов рядом с полем Объект.
Вместо того, чтобы наследовать непосредственно от Object для своих собственных классов часто лучше наследоваться от класса, более близкого к вашей задаче. Например:
- Наследуйте от
MonoBehaviour, если вы хотите написать пользовательский компонент, который вы можете добавить кGameObject, чтобы управлять тем, что делаетGameObjectили предоставить некоторые функции, связанные с ним. - Наследуйте от
ScriptableObject, если вы хотите создать пользовательские ассеты, которые могут хранить серийные данные.
Оба наследуют от UnityEngine.Object, но обеспечивают дополнительную функциональность для этих целей.
Примечание: UnityEngine.Object отличается от .NETБазовая System.Object, который не входит в шаблон скрипта по умолчанию, так что имена не конфликтуют. Вы все еще можете наследовать от .NET’s System.Object если вы хотите создать классы, которые вам не нужно назначать в Inspector.
Object класс предоставляет методы для создания и уничтожения объектов, а также для поиска ссылок на объекты конкретного типа. Подробнее об API класса Object см. в справочная страница скрипта для объекта.
Специальное поведение UnityEngine.Object
UnityEngine.Object является особым типом C# объект в Unity, потому что он связан с неуправляемым (C++Например, когда вы используете Camera компонент, Unity хранит состояние объекта в C++-объекте, а не в самом C#-объекте.
Unity в настоящее время не поддерживает использование C# WeakReference класс с экземплярами UnityEngine.Object. По этой причине, вы не должны использовать WeakReference для того чтобы сослаться на загруженный ассет. См. Майкрософта Документация по WeakReference для получения дополнительной информации о WeakReference class.
Unity C# и Unity C++ разделяют UnityEngine Объекты
Когда вы используете такой метод, как Object.Destroy или Object.DestroyImmediate для уничтожения объекта, выведенного из UnityEngine.Object, Unity уничтожает (разгружает) соответствующий объект C++. Вы не можете уничтожить объект C# явным вызовом, потому что сборщик мусора управляет памятью. Когда больше нет никаких ссылок на управляемый объект, сборщик мусора собирает и уничтожает его.
Если ваше приложение вновь пытается получить доступ к уничтоженному объекту UnityEngine.Object, Unity восстанавливает нативный объект-партнер для большинства типов. Два исключения из этого поведения восстановления: MonoBehaviours и ScriptableObjects: Unity никогда не перезагружает их после того, как они были уничтожены.
Операторы равенства
Для типов, наследующих от UnityEngine.Object, Unity использует пользовательскую версию C# операторы равенства и неравенства. Это означает проверку нуля myGameObject == null может оценить true (и наоборот myGameObject != null может оценить false) даже если myGameObject технически обладает действительным C# ссылка на объект. Это происходит в двух случаях:
- Объект может быть так называемым поддельным нулевым или замещающим объектом, который Unity использует в Редакторе только для заполнения неинициализированных полей MonoBehaviour. Эти объекты хранят полезную отладочную информацию, которая поможет вам найти источник этих полей, если вы попытаетесь ссылаться на них.
- Объект может быть управляемым (C#) объектом, который еще не был удален, но который должен считаться нулевым, поскольку неуправляемый (C++) соответствующий объект был уничтожен.
Поскольку операторы ?? и ?. не могут быть перегружены, они несовместимы с объектами, полученными из UnityEngine.Object. Операторы не возвращают те же результаты, что и операторы равенства и неравенства, когда вы используете их на уничтоженном MonoBehaviour или ScriptableObject, пока управляемый объект все еще существует.