Программирование скриптов в среде Unity.
Большое значение при организации взаимодействия 3d-объектов в пространстве имеет обнаружение столкновений (Сollision detection).
Сollision detection – это способ, с помощью которого анализируется 3D-пространство сцены на предмет столкновений между объектами. Присваивая объекту компонент Collider, мы фактически размещаем вокруг него невидимую сетку – так называемый коллайдер, который имитирует форму объекта и информирует о наличии столкновения с другим объектом. Например, в игре-симуляторе боулинга шары будут иметь простую сферическую форму коллайдера (Sphere collider), в то время как у объектов-кеглей коллайдер будет иметь форму цилиндра/капсулы или, для большей реалистичности столкновений, будет использовать меш (mesh), который является не чем иным, как описанием геометрии 3d-модели. Информация о столкновении коллайдеров поступает в физический движок, который сообщает столкнувшимся объектам их дальнейшую реакцию на это столкновение, основанную на направлении и силе удара, скорости и других факторах. Отметим, что использование коллайдеров, повторяющих форму меша модели, с одной стороны, дает более точное определение столкновений, но в то же время приводит к увеличению затрат на их вычисление.
Рассмотрим особенности столкновений объектов как с использованием непосредственного функционала Сollision detection, предоставляемого Unity3d, так и с помощью программирования такого взаимодействия на языке C#.
Для этого добавим в созданную ранее сцену новый кубический объект, выполняющий роль некоторого препятствия для падающего куба, смоделированного ранее (GameObject > Create Other > Cube), и придадим ему форму параллелепипеда.
Для изменения его формы можно воспользоваться свойствами компонента Transform на панели инспектора компонентов, либо с помощью инструмента масштабирования «Scale», предварительно выбрав геометрический объект. При этом в сцене можно увидеть три разноцветных квадратных куба по разным сторонам объекта, выполняющих роль узлов для изменения его размера в направлении, соответствующем осям координат сцены. Центральный куб позволяет изменять размер одно временно по всем осям координат.
Чтобы лучше увидеть картину взаимодействия куба и прямоугольного препятствия, необходимо развернуть исходное положение падающего куба – на ребро. Вращение выбранного объекта (куба) осуществляется в Unity3d c помощью инструмента «Rotate». При активации этого инструмента вокруг объекта появляется своеобразная сфера, определяющая углы его вращения в трехмерном пространстве. Захватывая и перемещая одну из ее сторон, можно вращать объект произвольным образом.
Далее переключившись в режим просмотра Game, можно наблюдать сцену взаимодействующих в ней объектов. Для определения факта столкновения объектов в Unity3d необходимо отличать эти объекты по их названию. Переименовать объект «Plane» (Плоскость) в объект «Ground», а параллелепипед, представляющий стену (препятствие), в объект «Wall», можно непосредственно выбрав объект в окне иерархии и применив к нему команду «Rename» из контекстного меню, после чего задать новое имя объекта. Отметим, что при разработке проектов в Unity3d разрешается ввод русскоязычных символов, однако при работе со скриптами необходимо использовать латиницу.
Для того чтобы заставить взаимодействовать между собой имеющиеся в сцене трехмерные модели, создадим скрипт на языке программирования C# и назовем его «Dialog» (Project > Create > C# Script).
Создание скриптов – один из наиважнейших моментов в разработке. Код, написанный для использования в Unity, опирается на ряд готовых встроенных классов.
Рассмотрим следующий код:
Первые две строки подключают к скрипту используемые пространства имен. Далее необходимо запомнить, что главным классом в Unity3d является MonoBehaviour. Любой пользовательский скрипт (в описанном случае это Dialog) должен быть его наследником, и неспроста – ведь именно этот класс реализует интеграцию всех объектов в основной цикл программы. Именно это наследование позволяет пользовательскому скрипту (классу) исполнять роль компонента и быть привязанным к игровому объекту.
Здесь метод «OnCollisionEnter» определяет столкновение объекта с другими объектами. А статический метод «Log» класса «Debug» пишет сообщение "Hit Something" в консоль Unity.
После сохранения скрипта добавляем его в качестве компонента для падающего куба. Для этого необходимо сначала выбрать соответствующий объект в окне иерархии и перетащить на него вновь созданный скрипт «Dialog». При этом необходимо обратить внимание на то, что добавленный скрипт также отображается внизу в окне «Inspector» в качестве компонента объекта, к которому он привязан
Теперь, перейдя в режим Play, можно наблюдать, что в тот момент, когда созданный объект куб коснется плоской поверхности, в консоли среды Unity3d (Window > Console) появляется соответствующее сообщение.
Заметьте, что такое сообщение будет выдаваться при каждом столкновении объектов. Причем последнее консольное сообщение отображается в статус (внизу окна).
Для выяснения того, с какими именно объектами столкнулся исходный объект, необходимо использовать значение параметра класса «Collision», которое будет принимать метод «OnCollisionEnter».
Открываем редактор скрипта и вставляем в него следующий код:
После открытия консоли (Window > Console) мы увидим, с какими именно объектами в сцене столкнулся куб. Таким образом, Unity3d позволяет нам оценить возможности взаимодействия объектов внутри среды.
Необходимо добавить префаб в проект (Project > Create > Prefab). В результате на панели Project в окне проекта появится префаб с именем «New Prefab». Переименуем его в «UprugostCube».
Префаб (Prefabs) – это конструкция подготовленных объектов и компонентов, предназначенная для их многократного использования в проекте. Экземпляр префаба может быть добавлен в любое количество сцен, а также многократно в одну сцену. Все экземпляры являются ссылками на оригинальный префаб и, фактически, его «клонами»; имеют те же свойства и компоненты, что и оригинальный объект.
Свойства созданного префаба «UprugostCube» описываются на панели инспектора, а его предварительный вид доступен в окне «Preview».
Для создания пары экземпляров префаба на плоскости необходимо просто его перетащить. В результате на плоскости появятся два куба, а в окне «иерархии» добавится объект с именем соответствующего префаба «UprugostCube».
Переключившись в режим просмотра «Game» и запустив сцену, можно увидеть, что добавленный куб ведет себя точно так же, как и оригинальный, обладая одинаковыми физическими свойствами.
Рассмотрим, каким образом можно удалять объекты в Unity3d в скриптах на языке C#. Для этого в окне «Project» создадим новый скрипт с именем «Destroy» и откроем его в редакторе скриптов MonoDevelop.
Как уже говорилось, при создании C# скрипта Unity создает некий каркас, состоящий из подключенных библиотек и основного класса (используемого скриптом) с методами Start() и Update().
В предыдущих случаях нами рассматривался метод Update, который вызывается каждый раз в новом кадре для каждого компонента всех объектов на сцене.
В данном случае мы воспользуемся методом Start(), который выполняется единожды для каждого компонента сразу после нажатия на кнопку «Play» и, соответственно, должен использоваться для инициализации переменных и придания им каких-либо начальных значений. Добавим в тело метода Start() функцию Destroy() и передадим в нее gameObject, указав таким образом, что скрипт должен уничтожить объект, компонентом которого он является:
Добавим этот скрипт к кубическому объекту, который должен удаляться, с помощью меню компонентов. Теперь после запуска сцены можно убедиться, что добавленный куб при запуске программы сразу пропадает.
Теперь попробуем уничтожить другой объект с помощью его поиска в среде. Для этого воспользуемся статическим методом Find() основного класса GameObject:
В случае необходимости уничтожения объекта не сразу, а спустя какое-то время, можно задать значение во второй параметр функции Destroy:
Далее рассмотрим скрипты, описывающие управление персонажем в трехмерной рабочей среде факультета. Наша среда представляет собой трехмерную модель учебного корпуса №2 ВГСПУ, который полностью занят помещениями факультета МИФ. Первое, что обеспечивает интерактивность, - это возможность обзора 3D пространства с помощью мыши.
Подключаем мышь с помощью данного отрезка скрипта. Переменные sensitivityX и sensitivityY отвечают за чувствительность мыши по вертикальной и горизонтальной осям. Переменные minimumX, maximumX, minimumY, maximumY указывают на какой угол может отклониться камера от начального положения. По оси Х эти значения равны -360 и 360, что означает, что игрок может свободно вращать камеру по оси Х. В вертикальной оси, эти значения равны -60 и 60. То есть, пользователь может отклонить камеру на 60 градусов вверх либо вниз. Для стандартных игр от первого лица эти значения равны -90 и 90.
Этот скрипт привязывается к объекту «камера» и вращает его в сторону, которую смещается мышь, в соответствии с чувствительностью. Если значение угла, принимаемое камерой, выходит за рамки, указанные в максимуме и минимуме, то оно будет возвращено до допустимого значения. Вращение осуществляется стандартной функцией transform.rotate, примененной к объекту «камера».
Теперь, рассмотрим скрипт перемещения в другую локацию по клику мышью на двери.
Мы перетаскиваем его на объект Door, тем самым, применяя его к данному объекту.
Когда пользователь, находясь в виртуальной среде, кликает мышью по двери аудитории, все объекты текущей его локации уничтожаются и только после этого загружается сцена аудитории. Такой подход позволяет не держать постоянно в памяти все объекты, задействованные в данном проекте, и выгружает их из памяти, когда они не нужны.
Таким образом достигается увеличение быстродействия, что в купе с с использованием запеченых текстур и прочих упрощений позволяет достичь хороших результатов оптимизации.
Заключение.
В ходе нашего исследования все поставленные задачи были решены.
Мы определили сущность виртуальной рабочей среды – это совокупность информационных ресурсов, обеспечивающая комплексную методическую и технологическую поддержку процесса работы. Также, мы определили специфику виртуальной рабочей среды во множестве программных продуктов. Виртуальная учебная среда обеспечивает максимальную интерактивность обучения, повышая качество образования и уменьшая временные затраты на обучение. Мы рассмотрели классификацию и особенности и выявили специфику рабочей среды, условности организации взаимодействия между пользователем и интерфейсом. Рассмотрели виртуальную среду, как средство обучения и как инструмент для саморазвития.
Мы изучили особенности виртуальной среды, как рабочего и учебного места. Такая среда предоставляет практически неограниченные возможности для моделирования и экспериментов. Пределом сложности устанавливаемых задач может служить сложность внутренней организации среды, а также, производительность аппаратной части проекта.
Мы изучили устройство виртуальной среды с помощью среды разработки Unity. Это довольно сложный пакет программ, позволяющий разрабатывать виртуальные игровые миры. Он находится среди лидеров по производительности среди 3D рендереров. Также, Unity обладает целым рядом преимуществ по сравнению со своими ближайшими аналогами. Среди достоинств этой среды разработки следует, также, упомянуть мультиплатформенность.
В ходе выполнения курсовой нашей командой была разработана виртуальная рабочая среда факультета МИФ ВГСПУ. Мы изучили дидактические возможности трехмерной виртуальной рабочей среды и заключили, что видео-лекции являются, на наш взгляд, самой приемлемой формой лекций в нашей среде. Также наш проект не страдает нехваткой практики, и учащиеся всегда могут выполнить различные эксперименты и опыты. Для учащихся всегда в наличии электронная библиотека, которая в состоянии заменить обычную традиционную библиотеку.
Наш проект позволяет полностью окончить курс обучения или даже получить специальность. График занятий гибкий и подстроен под учащихся. Виртуальные практические занятия вполне могут заменить традиционные. Этот проект – это еще один шаг на пути развития информационного общества, поэтому он может быть внедрен.
Литература
1. Вайндорф-Сысоева М. Е., Хапаева С. С., Шитова В. А. Алгоритм деятельности при сетевом взаимодействии для решения образовательных задач в виртуальной образовательной среде МГОУ. – М., 2008.
2. Герасимов В. Unity 3.x Scripting. – Packt Publishing, 2011.
3. Калмыков Д. А., Хачатуров Л. А. Опыт реализации виртуальных образовательных сред. Школьные технологии №2, 2002.
4. Карташева О.В. Использование адаптивной системы тестирования АСТ-тест для контроля знаний при дистанционном изучении темы «Базы данных» // Материалы международной конференции-выставки «Информационные технологии в образовании». - Москва, 2001.
5. Князев А. С. Организация виртуального рабочего пространства факультета вуза на базе инструментария Unity3D // Материалы Всероссийской научно-практической конференции «Прикладная информатика и компьютерное моделирование» г. Уфа. Том 3. Уфа: БГПУ им. М. Акмуллы, 2012. С. 15-17.
6. Репкин Д. Виртуальная реальность или киберпространство. 2002
7. Седова Д. В. Организация учебного процесса в виртуальной образовательной среде с применением социальных сетей. – Дубна, 2008.
8. Степчева З.В. Основы геометрического моделирования в Unity 3D. Учебное электронное издание. УлГТУ – Ульяновск, 2012.
9. Этко И.Г. Компьютерные тесты по информатике и информационным технологиям в сети Интернет. Журнал «Педагогическая информатика», № 1, 2005, с. 77-83.
10. Goldstone, W. Unity Game Development Essentials. – Packt Publishing, 2009. –316 с.
11. Creighton, R.-H. Unity 3D Game Development by Example Beginner's Guide. – Packt Publishing, 2010. – 384 c.
12. Sue Blackman. Beginning 3D Game Development with Unity: All-in-one, Multi-platform Game Development. – Apress, 2011. – 992 с.
13. Виртуальная образовательная лаборатория http://www.virtulab.net/.
14. Информационные технологии в образовании. Сайт учителей: http://www.rusedu.info
15. «Молодой ученый». Ежемесячный научный журнал: http://www.moluch.ru