Кажется, что это гибрид новизны Unity и самого C#. Давайте разберемся с этим:
Наследование
Когда вы пишете сценарий Unity, вы обычно пишете класс C#. Этот класс и вся его информация содержится в коротких (фигурных) фигурных скобках "{" и "}". Однако этот класс также может наследовать от другого класса. Рассмотрите наследование как использование шаблона. Monobehaviour - это определенный в Unity класс, который имеет набор полей, свойств и методов, уже созданных, например, «Update ()», «Start ()», «gameObject» и т. Д. c. Когда вы наследуете от MonoBehaviour, вы на самом деле говорите «использовать шаблон MonoBehaviour».
Так что в следующем коде уже есть много полей / методов, доступных для него из наследования MonoBehaviour, даже если вы не написали ни одного себя:
public class NewScript : MonoBehaviour
{
}
Поля уровня класса
Поле - это то, что вы видите, когда вы "объявляете" переменную:
float numA = 100;
Как вы можете видеть выше код, я могу присвоить значение полю, когда оно объявлено. Это объявление происходит, как только класс создается. В этом случае присвоение объявленной переменной происходит сразу после объявления. Если бы я попытался объявить свое поле с данными из другого класса, а другой класс еще не был создан, он потерпел бы неудачу.
Unity Engine и MonoBehaviour
Теперь, когда мы установили что в вашем классе все происходит "под прикрытием" с MonoBehaviour и что объявления полей уровня класса происходят немедленно, мы можем понять суть вещей:
Вот упрощение того, как запускается программа Unity:
- Все GameObjects созданы, их Компоненты инициализированы, а их сценарии созданы.
- Все Компоненты запускают Awake ().
- Все Компоненты запускают Start ().
- Начинается игровой цикл (Update, FixedUpdate, LateUpdate и т. Д. c.).
Обратите внимание, что некоторые объекты GameObject и Компоненты могут создаваться раньше других. Если вы попытаетесь вызвать GetComponent для GameObject до создания другого компонента, произойдет сбой. Вот почему вы не можете вызывать GetComponent на этапе конструктора, когда ваши поля объявлены.
Альтернатива
Unity позволяет сериализовать поля в монобихе, отображая их в инспекторе. Вместо этого вы можете написать декларации полей с заголовком [SerializeField] (или сделать ваши поля общедоступными) и перетащить в них компоненты в инспекторе:
[SerializeField] private Collider myCollider; // variables declared here
[SerializeField] private Rigidbody myRigidbody;