Почему нельзя создать экземпляр компонента в юнити?
Почему нельзя сделать RigidBody body = new RigidBody()
, вместо GetComponent<RigidBody>
? Как это работает с точки зрения C#?
Почему нельзя сделать RigidBody body = new RigidBody()
, вместо GetComponent<RigidBody>
? Как это работает с точки зрения C#?
Компонент не может существовать сам по себе, он существует только в экосистеме GameObject
та. GameObject
его создает, апдейтит, отправляет калбеки типа Start()
или OnCollisionEnter()
и уничтожает.
Для добавления нового компонента используется AddComponent<T>()
. Не все компоненты могут быть на GameObject
в множественном количестве, можно добавить хоть 10 AudioSorce
, но RigidBody
может быть только один, из-за атрибута [DisallowMultipleComponent]
во избежание противоречий того что объект имеет тело массой 10 подверженной гравитации и тело массой 100500 не подверженное гравитации одновременно. Некоторые компоненты не могут существовать без других как FixedJoint
не может существовать без RigidBody
из-за атрибута [RequireComponent(typeof(Rigidbody))]
и добавляется автоматически и удалить его будет не возможно пока на нем FixedJoint
или другой компонент который в нем нуждается. За всем этим следит GameObject
.
MonoBehaviour
ы наследуют свойство gameObject
, объект к которому он принадлежит. GetComponent<T>()
это gameObject.GetComponent<T>()
, как и transfomr
, которой тоже компонент это gameObject.GetComponent<Transform>()
(но уже кешированный). MonoBehaviour
неразрывно связан с GameObject
.