Почему нельзя создать экземпляр компонента в юнити?

Рейтинг: 0Ответов: 1Опубликовано: 18.01.2023

Почему нельзя сделать RigidBody body = new RigidBody(), вместо GetComponent<RigidBody>? Как это работает с точки зрения C#?

Ответы

▲ 2Принят

Компонент не может существовать сам по себе, он существует только в экосистеме 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.