Программирование Unity — это программирование в межплатформенной среде создания компьютерных игр, разработанной американской корпорацией Unity Technologies.
Введение
В Unity скрипты могут использоваться для формирования фактически любых элементов игр или интерактивного контента с графикой в реальном масштабе времени. Unity способна поддерживать скрипты на C#, которые созданы согласно одному из двух основных подходов:
- Традиционный и повсеместно используемый объектно-ориентированный подход.
- Информационно-ориентированный подход, который сегодня тоже поддерживается в Unity.
Unity поддерживает C#, который считается стандартным в отрасли языком программирования, в определенной степени похожим на Java или C++. По сравнению с C++, C# считается более легким для изучения. Помимо этого, его следует отнести к категории языков «с управлением памятью», то есть, он способен осуществлять автоматическое распределение памяти, устранять утечки и многое другое.
Обычно C# удобнее C++, если пользователю необходимо прежде всего создать игру, а затем уже работать над разными сложными моментами, связанными с программированием.
Программирование Unity
Весь интерактивный набор возможностей и игровой процесс в Unity выстраиваются на базе следующих фундаментальных блоков:
- Блок объектов GameObject.
- Блок компонентов.
- Блок переменных.
Каждый объект в игре выступает как GameObject, который может быть персонажем, источником света, спецэффектом, декорацией и так далее.
Игровые объекты сами по себе не обладают никаким поведением. Для того чтобы объект мог начать свою работу, игровому объекту необходимы разные атрибуты, которые добавляются при помощи компонентов. Компоненты (Component) способны определять манеру поведения игровых объектов, к которым они присоединены, и могут управлять ими. Простым примером может служить формирование источника света, которое включает прикрепление компонента Light к GameObject. Таким же примером может являться прибавление компонента Rigidbody к объекту, для того чтобы он был способен падать.
Компоненты обладают рядом свойств или переменных, которые могут быть настроены в окне Inspector редактора Unity и (или) при помощи скрипта. В примере, приведенном выше, к свойствам источника света следует отнести дальность, цвет и интенсивность. В Unity имеется очень много самых разных компонентов, но это не отменяет возможности для пользователя сформировать свой собственный компонент для реализации каких-либо алгоритмов. Это можно реализовать при помощи скриптов, в которых описывается собственная игровая логика пользователя и поведение объектов, которые далее могут прикрепляться к игровым объектам в качестве компонентов. Каждый скрипт может быть связан с внутренними механизмами Unity за счет реализации класса, который является производным от встроенного класса MonoBehaviour.
Компоненты на базе скриптов предоставляют возможность запуска игровых событий, проверки объекта на предмет столкновений, применения физических свойств, программирования реакции на управление пользователя и многое другое.
Стандартная модель «игровой объект — компонент» отлично работает и в настоящее время, поскольку она считается простой как для программистов, так и для других пользователей, а также является удобной для формирования интуитивных интерфейсов. Если добавить компонент Rigidbody к объекту GameObject, то он станет падать, а если добавить компонент Light, то GameObject станет излучать свет. Все остальные процедуры тоже должны подчиняться данной несложной логике.
Причем система компонентов была сформирована на базе объектно-ориентированной платформы, что может создать сложности для программистов при работе с кэшем и памятью развивающегося оборудования. Компоненты и игровые объекты следует отнести к «тяжелым объектам C++». Все объекты GameObject обладают именем. Их компоненты являются оболочками для C# поверх компонентов на C++. Это обстоятельство способно упростить работу с ними, но может повлиять на производительность, когда они хранятся в памяти без явной структуры.
Объект C# способен располагаться на любых участках памяти. Объект C++ также может располагаться в любых участках памяти. То есть, группирования и последовательного размещение объектов в памяти просто нет. При любой загрузке в центральный процессор с целью обработки, объект нужно собирать по фрагментам из различных участков памяти. Это обстоятельство способно сильно замедлять загрузку, а оптимизация требует значительных усилий.
Для решения таких проблем ведется переработка базовых систем Unity на базе высокопроизводительного, многопоточного стека информационно-ориентированных технологий или DOTS (в настоящее время находится в стадии предварительной версии). DOTS может позволить разрабатываемой игре эффективно применять весь набор возможностей самых последних многоядерных процессоров. Стек имеет в своем составе следующие компоненты:
- систему задач C# для эффективного выполнения кода на многопоточных системах,
- систему Entity Component System (ECS), предназначенную для формирования высокопроизводительного кода по умолчанию,
- программу компиляции Burst, которая является компилятором скриптов в оптимизированный нативный код.
ECS является новой системой компонентов в составе DOTS. Все стандартные объектно-ориентированные действия над GameObject должны отражаться на экземпляре в новой системе. Наименование «Компонент» никак не поменялось. Самое важное отличие заключается в структуре данных. Кроме того, что это улучшенный подход к формированию кода игры с точки зрения дизайна, ECS дает возможность пользователям применять систему задач C# Unity и программу компиляции Burst, что позволяет в полной мере воспользоваться преимуществами современного компьютерного оборудования. Многопоточные системы DOTS позволяют реализовать создание игр для самых разнообразных устройств и формировать богатые игровые миры со значительным количеством элементов и сложными симуляциями.