Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

Объект

UnityEngine.Object класс служит базовым для всех объектов, на которые Unity может ссылаться в редакторе. Классы, наследующие UnityEngine.Object в поля в Inspector, или выбрать их с помощью Выборщика объектов рядом с полем Объект.

Пример поля объекта в окне Inspector. Выборщик объектов представляет собой круглую иконку справа от поля.
Пример поля объекта в окне 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 Engine. В каждом контейнере находится собственное представление UnityEngine.Object. Соединительные линии между слоями показывают связь между экземпляром Object на управляемом уровне и его неуправляемым аналогом.
Два расположенных рядом контейнера представляют неуправляемый и управляемый слои Unity Engine. В каждом контейнере находится собственное представление UnityEngine.Object. Соединительные линии между слоями показывают связь между экземпляром Object на управляемом уровне и его неуправляемым аналогом.

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# ссылка на объект. Это происходит в двух случаях:

  1. Объект может быть так называемым поддельным нулевым или замещающим объектом, который Unity использует в Редакторе только для заполнения неинициализированных полей MonoBehaviour. Эти объекты хранят полезную отладочную информацию, которая поможет вам найти источник этих полей, если вы попытаетесь ссылаться на них.
  2. Объект может быть управляемым (C#) объектом, который еще не был удален, но который должен считаться нулевым, поскольку неуправляемый (C++) соответствующий объект был уничтожен.

Поскольку операторы ?? и ?. не могут быть перегружены, они несовместимы с объектами, полученными из UnityEngine.Object. Операторы не возвращают те же результаты, что и операторы равенства и неравенства, когда вы используете их на уничтоженном MonoBehaviour или ScriptableObject, пока управляемый объект все еще существует.

Дополнительные ресурсы