Компоненты и моноповедения в Unity
Каждый игровой объект в Unity состоит из компонентов. Любой компонент четко реализует конкретный набор поведений, необходимых для того, чтобы выполнялся GameObject. Почему объект получается таким, каков он есть? Именно благодаря вкладу, который вносят компоненты, из которых этот объект состоит.
На картинках ниже — объект «Warrior». Он показан над окном «Инспектор» в интерфейсе игрового движка Unity. Обратите внимание на проиллюстрированные разделы (Animator, Rigidbody, Collider) – они, как раз таки, и являются компонентами, слагающими этот объект.
Представим, к примеру, что речь идет про автомобиль в игре:
— у единственного «видимого» элемента авто будет компонент Renderer, отрисовывающий машину и, скорее всего, компонент Collider, который задает для авто границы столкновений; — если авто представляет персонажа, то у самого объекта Car возможно наличие Player Input Controller (контроллера ввода от персонажа). Этот контроллер принимает все события, связанные с нажатиями клавиш, а также транслирует их в код, который, в свою очередь, отвечает за движение автомобиля в игре.
Нельзя не сказать, что есть возможность писать большие и сложные компоненты, в которых компонент один в один равен кодируемому объекту (к примеру, компонент player содержит код, который полностью описывает персонажа, а компонент enemy, в свою очередь, полностью кодирует противника). Как правило, принято извлекать логику и дробить ее на небольшие «обтекаемые» кусочки, которые будут соответствовать конкретным признакам. К примеру: • все объекты, которые обладают здоровьем, будь то Player или Enemy, могут иметь компонент LivingObject, который задает исходное значение здоровья, принимает урон и приводит в исполнение смерть, если объект умирает; • у игрока может быть компонент ввода, который контролирует сообщаемые ему движения, а у врага — аналогичный компонент, реализованный посредством искусственного интеллекта.
На протяжении своего жизненного цикла компоненты получают разные обратные вызовы, которые в среде Unity называются Сообщениями. В частности, к Сообщениям относятся: — OnEnable/OnDisable, — Start, — OnDestroy, — Update и прочие.
Если объект реализует метод
Наверное, вы уже догадались, что компоненты могут предоставлять и публичные методы. В таком случае другие компоненты могут принимать ссылку на данный компонент и вызывать эти публичные методы.
Остается добавить, что в коде есть MonoBehavior — вездесущий родительский класс, предназначенный для представления компонентов. Большая часть невстроенных компонентов будут наследовать от MonoBehavior, а он уже, в свою очередь, будет наследовать от Behavior и Component, соответственно.
По материалам статьи «Basic Concepts in Unity for Software Engineers».