close

Вход

Забыли?

вход по аккаунту

?

Zhirnov Nikitin

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение
высшего профессионального образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
ОСНОВЫ РАБОТЫ В UNITY3D
Методические указания
к выполнению лабораторных работ
для студентов направления 230100.68
«Информатика и вычислительная техника»
Санкт-Петербург
2013
Составители: А. Н. Жирнов, А. В. Коновалов, А. А. Преображенский
Под редакцией А. В. Никитина
В методических указаниях приведен цикл лабораторных работ по освоению мультиплатформенного инструмента двух- и трехмерного моделирования Unity3d.
Методические указания предназначены для студентов направления
230100.68, изучающих дисциплины по магистерской программе «Системы
мультимедиа и компьютерная графика».
В авторской редакции
Верстальщик И. Н. Мороз
Сдано в набор 27.05.13. Подписано к печати 10.06.13.
Формат 60×841/16. Бумага офсетная. Усл. печ. л. 3,72.
Уч.-изд. л. 4,0. Тираж 100 экз. Заказ № 
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
© Санкт-Петербургский государственный
университет аэрокосмического
приборостроения (ГУАП), 2013
ВВЕДЕНИЕ
Unity – это мультиплатформенный инструмент для разработки 2-х и 3-х мерных приложений и игр, работающий на операционных системамах Windows и OS X. Созданные в Unity приложения могут работать на операционных системах Windows,
OS X, Android, Apple iOS, а также на игровых приставках Wii,
PlayStation 3 и XBox 360. Также, реализована возможность создавать интернет-приложения с помощью специально подключаемого
модуля к браузеру Unity, а также с помощью экспериментальной
реализации в рамках модуля Adobe Flash Player. Приложения,
созданные с помощью Unity, поддерживают DirectX и OpenGL [1].
Установка и знакомство с интерфейсом
Дистрибутив Unity3D можно бесплатно скачать с официального
сайта Unity (рис. 1): http://unity3d.com/unity/download/
Рис. 1. Страница, откуда можно скачать Unity3D
3
Рис. 2. Приложение при первом запуске
Затем производится установка скачанного дистрибутива. После установки приложение попросит зарегистрироваться и выбрать тип лицензии. В учебных целях вполне хватит Trial версии,
которая поставляется бесплатно. При первом запуске приложения
­будет загружен пример проекта, включающий сцену с трехмерным
окружение, светом и т.д. (рис. 2)
В случае, если проект не загрузился или вообще отсутствует
в установленном дистрибутиве, то можно либо загрузить произвольный проект, а затем открыть его (File>Open Project>Open
Other>папка, в которой находится проект; после этого Unity сам
подгрузит проект), либо создать свой новый проект (подробнее
описано в лабораторной работе № 1). Если тестового проекта нет
в поставке, то Unity при загрузке предложит открыть какой-либо
проект или создать новый.
Познакомимся с интерфейсом среды. Наибольшее место на
экране занимает окно вида сцены, на нем отображается смоделированная сцена со всеми объектами (рис. 3).
Ее можно осмотреть, нажав на значок с изображением руки
в верхнем левом углу окна сцены (рис. 4).
После нажатия на данный значок появляется возможность осмотреть сцену: зажатая левая кнопка мыши позволяет передвинуть положение камеры, зажатая правая кнопка мыши – повернуть камеру, колесо мышки – приближение/отдаление камеры.
4
Рис. 3. Окно вида сцены
Рис. 4. Кнопки управления перемещением по сцене и модификации объекта
Рис. 5. Hierarchy
Следующая кнопка в виде перекрещивающихся стрелок позволяет перемещать объект по сцене, кнопка с округлыми стрелками –
вращать вокруг своей оси и последняя кнопка позволяет масштабировать.
Слева внизу под окном сцены расположен список под названием
Hierarchy (Иерархия). В нем перечислены все объекты, добавленные в сцену (объекты, персонажи, источники света и т.д.) (рис. 5).
5
Рис. 6. Project
Правее данного окна находится окно Project, в котором перечислены все заготовки и уже созданные скрипты, текстуры, шрифты, сцены, входящие в текущий проект (рис. 6).
Всю правую часть окна приложения занимает Inspector. Если из
списка Hierarchy выбрать какой-либо объект, то в окне Inspector
отобразится вся информация о данном объекте в сцене: положение
по координатной сетке, наклоны, примененные скрипты, нанесенные текстуры, физическая модель и ее настройки и др. (рис. 7).
В верхней части окна приложения располагается главное меню
(рис. 8).
Оно включает в себя пункты:
– File, содержит подпункты, отвечающие за создание, открытие
и сохранение проектов и сцен, а также настройки для компиляции
готового приложения;
– Edit, отвечает за вырезание/вставку выделенных объектов,
переключение режимов Play/Pause/Step, настройки сцены, параметры эмуляции и др.;
– Assets, включает инструменты для импорта и экспорта наборов (assets),а также позволяет создать новые материалы, текстуры, скрипты и др.;
– GameObject, позволяет создавать такие физические объекты
как системы частиц, камеры, источники света и простейшие трехмерные формы и др.;
– Component, отвечает за настройку характеристик объектов:
физика, сглаживание, отображение, аудио эффекты и др.;
– Terrain, содержит инструменты для работы с ландшафтом;
– Tools, включает различные инструменты для работы с про­
ектом;
6
Рис. 7. Inspector
Рис. 8. Главное меню
– Window, позволяет настроить внешний вид среды, расположение
окон и позволяет получить доступ к каждому из них по отдельности;
– Help, содержит ссылки на форумы и руководства по Unity,
­ответы на часто задаваемые вопросы и т.д.
Список использованных источников
1. Официальный сайт Unity, URL: http://unity3d.com/unity.
7
Лабораторная работа № 1
“РАЗРАБОТКА ЛАНДШАФТА,
ПОСТАНОВКА ОБЩЕГО ОСВЕЩЕНИЯ”
Цель работы: Ознакомление и создание ландшафта, постановка
общего освещения, наложение текстур, добавление стандартных
объектов (деревья) и вставка в сцену First Person Controller.
Порядок выполнения работы
Создание поверхности, на которой будет создаваться рельеф
местности с применением текстур и добавлением объектов. Создание общего источника освещения. Формирование отчета.
Для того чтобы начать работу над новым проектом в Unity3D,
необходимо создать этот новый проект, для этого в меню интерфейса откроем File>New Project. В открывшемся окне, в строке
(Project Directory) указываем путь, где будет сохранен проект
и его название. Далее выбираем все пункты пакетов расширений
(packages). Нажимаем Create Project. (рис. 1.1).
После создания и загрузки проекта, появится новая пустая сцена, в которой и будем работать, создавать ландшафт, глобальное
освещение и т.д.
Рис. 1.1. Окно выбора пакетов расширения
8
Рис. 1.2. Пустая поверхность
В начале работы при создании ландшафта, создадим простую
поверхность (землю), для этого в меню интерфейса выбираем
Terrain и нажимаем Create Terrain. Появилась пустая поверхность, на которой создадим ландшафт и освещение (рис. 1.2).
Стандартно, новая поверхность (Terrain) создается очень большой, для удобства работы уменьшим ее размер. Для этого в меню
интерфейса выбираем Terrain>Set Resolution и указываем Terrain
Width 500, Terrain Height 150, Terrain Length 500 и нажимаем Set
Resolution. Новые размерности поверхности – 500×500 метров и до
150 м. в высоту.
Теперь добавим небо и установим источник глобального освещения. Небо создается с помощью специального объекта Skybox,
который окружает поверхность со всех сторон. Для создания неба
(Skybox), в меню интерфейса открываем вкладку Edit и выбираем
Render Settings. В окне инспектора откроются настройки Skybox,
в которых нажимаем на кружок рядом с пунктом Skybox Material,
для выбора материала неба (Рисунок 1.3, слева). В открывшемся
диалоговом окне, выберем нужный материал для Skybox (Рисунок 1.3, справа) например Sunny2 Skybox.
После того, как нужный материал для Skybox будет выбран, вокруг поверхности появится небо (рис. 1.4).
Далее приступим к созданию источника освещения, для этого
в меню интерфейса открываем GameObject>Create Other>Directional
Light. На сцене появился источник направленного освещения.
Устанавливаем и вращаем полученный источник света как нам
9
Рис. 1.3. Настройки Skybox (слева), меню материалов (справа)
Рис. 1.4. Небо в окне вида сцены
удобно с помощью инструментов в верхнем левом углу окна вида
сцены. Затем приступаем к его настройке в инспекторе (рис. 1.5).
В основных настройках можно поменять цвет исходящего света (Color), задать интенсивность (Intensity), выбрать тип теней
(Shadow Type), а также создать эффект солнечного блика при направлении камеры на источник света (Flare).
После создания неба и источника освещения, приступим к редактированию плоскости Terrain и создадим, таким образом,
­рельеф земли. Для создания неровностей на поверхности в окне
Hierarchy выбираем Terrain. В открывшемся редакторе ландшафта выбираем кисть Raise and lower the terrain height (рис. 1.6).
10
Рис. 1.5. Настройки источника освещения
Рис. 1.6. Редактор ландшафта
11
Выбрав кисть, щелкаем левой клавишей мыши по поверхности ландшафта и создаем неровности: горы, холмы, впадины. Для
того, чтобы удалить неровность, необходимо зажать на клавиатуре
клавишу Shift и нажимать левую клавишу мыши, наводя курсор
на объект, который необходимо сгладить. Для изменения размера
кисти используем настройку Brush Size, также можно изменить
тип кисти в поле Brushes. За интенсивность отвечает ползунок
Opacity. Пользуясь перечисленными инструментами можно создать рельеф местности, пример (рис. 1.7).
После создания рельефа наложим текстуру травы. В редакторе
Terrain выбираем вкладку Paint the terrain texture (рис. 1.8).
Далее нажимаем кнопку Edit Textures. В открывшемся окне нажимаем Splat и выбираем текстуру Grass, нажимаем add. Вся поверхность заполнится текстурой Grass (рис. 1.9).
Для применения других текстур необходимо сначала выбрать
их в пункте меню Edit Textures, а затем с помощью кисти окрасить
ими необходимые участки местности для придания окружению
большей реалистичности (рис. 1.10).
Теперь добавим на поверхность деревья, для этого в редакторе
Terrain выбираем вкладу Place Trees (рис. 1.11).
Рис. 1.7. Созданный рельеф
Рис. 1.8. Инструмент для наложения текстур на поверхность
12
Рис. 1.9. Рельеф с текстурой Grass
Рис. 1.10. Рельеф с различными текстурами
Нажимаем кнопку Edit Trees далее нажимаем add trees для выбора тип дерева, которое мы ходим добавить на поверхность, например BigTree и добавляем его на сцену кликая по нужной области поверхности (рис. 1.12).
13
Рис. 1.11. Инструмент для создания деревьев на поверхности
Рис. 1.12. Добавленные деревья
В настройках можно выбирать высоту и толщину деревьев Tree
Height и Tree Width, также с помощью Brush Size выбрать количество добавляемых деревьев (рис. 1.13).
Подобным способом, через вкладку Paint Details на сцену добавляются и другие виды растительности, например трава.
Следующая задача это добавление в сцену действующего лица персонажа (First Person Controller). Для этого в окне Project раскроем папку Standard Assets, далее переходим в папку Character
Controllers и выбираем First Person Controller, перетаскиваем его
на сцену (рис. 1.14).
Запускаем режим игры с помощью клавиши Play, которая расположена в верхней части окна вида сцены. Теперь мы можем видеть
и перемещаться по сцене, управляя персонажем от первого лица.
Наконец необходимо сохранить получившуюся сцену. Для этого нажимаем File>Save Scene As, затем выбираем место, где будет
сохранена сцена и ее название.
14
Рис. 1.13. Настройки инструмента
добавления деревьев
Рис. 1.14. Добавление First Person Controller
Индивидуальные задания
Контрольные вопросы:
1. С чего начинается создание ландшафта?
2. Можно ли поменять цвет или интенсивность общего осве­
щения?
15
3. Возможно ли удалить созданную неровность на плоскости?
4. Как менять размер, ширину и количество деревьев?
Содержание отчета:
1. Цель работы.
2. Созданный ландшафт с текстурами и объектами (деревья,
камни, трава).
3. Созданный источник освещения.
4. Скриншоты готовой сцены.
5. Выводы о проделанной работе.
Список использованных источников
1. Курс уроков по Unity3D от Flight Dream Studio/Alcatraz,
URL http://unity3d.ru/distribution/viewtopic.php?f=11&t=5048&
sid=1422449116a2037825c2c64ba4ea1a91.
16
Лабораторная работа № 2
«ИМПОРТ МОДЕЛЕЙ В ПРИЛОЖЕНИЕ,
ПОСТАНОВКА ЛОКАЛЬНОГО ОСВЕЩЕНИЯ»
Цель работы: Ознакомление с импортом моделей в Unity3D на
примере моделей 3Ds Max. Ознакомление с постановкой локального освещения.
Порядок выполнение лабораторной работы
Для импорта моделей на сцену следует открыть сцену, созданную в лабораторной работе № 1. Для этого нажимаем (File>Open
Scene) и выбираем сохраненную сцену. После того как загрузилась
сцена приступим к импорту моделей. Возьмем простую готовую
модель формата .max (рис. 2.1).
Свернем приложение и скопируем файл модели формата .max
в папку, где находится проект. Unity сам экспортирует модель в
формат .fbx и добавит ее в свой раздел (Project). Из раздела Project
перетаскиваем модель на сцену, если нужно изменяем размер и положение модели (рис. 2.2).
Чтобы персонаж не проходил сквозь объект и не проваливался
в него, необходимо сделать для модели коллайдер (Collider). Коллайдер позволяет обрабатывать столкновение объекта с другим
объектом, например, в игре персонаж не должен проходить сквозь
стену, а должен столкнуться с ней.
Коллайдеры добавляются через меню Component>Physics. Существует несколько видов коллайдеров:
Рис. 2.1. Модель формата max
17
Рис. 2.2. Импортированная модель в сцене
– Box Collider – в форме параллелепипеда;
– Sphere Collider – в форме сферы;
– Capsule Collider – в форме капсулы;
– Mesh Collider – автоматически создает коллайдер по форме
сетки объекта;
– Wheel Collider – коллайдер колеса автомобиля;
Различные типы коллайдеров применяются для разных типов объектов, например, Sphere Collider применятся для моделей
в форме шара.
Для того, что бы добавить коллайдер, который будет повторять форму объекта, в разделе Hierarchy выделяем нужную нам
модель и применим к ней коллайдер сетки (Mesh Collider) Com­
ponent>Physics>Mesh Collider. Если для передачи формы и модели
столкновений объекта хватает обычных коллайдеров, то рекомендуется использовать их, так как коллайдер сетки очень требователен к ресурсам системы и его применение отрицательно скажется
на производительности.
Теперь, для реалистичности сцены, создадим источники локального освещения. Для этого в меню интерефейса открываем
(GameObject) выбираем (Create Other) далее (SpotLight) Появиться источник локального освещения, расставляем и вращаем полученный источник света как нам удобно, например такой источник
можно применять для создания прожектора (рис. 2.3).
18
Рис. 2.3. Использование источника освещения SpotLight
Рис. 2.4. Использование источника освещения Point Light
Таким же способом создается источник освещения (PointLight),
который удобно применять в качестве светящихся лампочек.
В основных настройках можно поменять цвет исходящего света
(Color), задать интенсивность (Intensity), и размер “пятна” освещения (Spot Angle) (рис. 2.4).
Расставив модели и освещение, можно получить готовую сцену,
которая будет выглядеть, например, как на рисунке (рис. 2.5).
19
Рис. 2.5. Модель Военной базы
Индивидуальные задания
Контрольные вопросы:
1. Каким образом происходит импорт моделей в Unity3D?
2. Как обеспечить столкновение объектов друг с другом?
3. Можно ли изменять интенсивность и цвет локального осве­
щения?
Содержание отчета:
1. Цель работы.
2. Скриншот импортированной модели на сцену.
3. Скриншот с использованием локального источника осве­
щения
4. Выводы о проделанной работе.
Список использованных источников
1. Курс уроков по Unity3D от Flight Dream Studio/Alcatraz, URL:
http://unity3d.ru/distribution/viewtopic.php?f=11&t=5048&sid=
1422449116a2037825c2c64ba4ea1a91.
20
2. Набор моделей для создания военной базы, URL: http://
narod.ru/disk/47579452001.c8c01371d0688314d0132edd1c9fe0aa/
eam_v84_vray_maps.rar.html
Введение в скриптинг
Для организации логики работы приложения в Uinty3D используются программные средства – скрипты. Среда поддерживает ­несколько языков программирования: C#, JavaScript и Boo.
Скрипт стандартного вида выглядит следующим образом.
В данном курсе будут использоваться языки JavaScript и C#.
JavaScript:
function Start ()
{
}
function Update ()
{
}
C#:
using UnityEngine;
using System.Collections;
public class name : MonoBehaviour {
void Start ()
{
}
void Update ()
{
}
}
При создании нового скрипта он будет выглядеть именно так.
Разберем подробнее скрипт на C#.
В данном скрипте командами using UnityEngine; и using
System.Collections; подключаются две основные библиотеки,
с которыми изначально работает скрипт: UnityEngine, System.
Collections. В зависимости от необходимости можно подключать
21
другие библиотеки. Объявление подключаемых библиотек на любом из используемых языков программирования всегда находится
в начале скрипта.
Далее, следует объявление класса, наследуемого от MonoBeha­
viour, имя которого должно соответствовать имени скрипта, что
специфично для языка C#. В фигурных скобках, относящихся
к данному классу должен находиться весь текст скрипта. Далее
приведены основные наиболее часто используемые методы.
Метод Start() используется для запуска начальных операций
и выполняется по умолчанию только один раз при инициализации
объект, к которому прикреплен скрипт.
Метод Update(), операторы которого выполняются для каждого
кадра при исполнении приложения.
Кроме того, часто используется метод OnGUI(). Он предназначен для создания графического интерфейса и обработки поступающих через него команд. Выполняется также для каждого кадра.
Кроме этих основных трех методов существуют еще несколько заранее определенных методов с определенными названиями
и способами исполнения, но в рамках данного курса они упо­
минаться не будут. Также разработчик может создавать собственные методы, определяя для них входные и выходные данные, название и вызывая их из необходимого места скрипта.
Стоит обратить внимание на синтаксис метода. Сначала идет
тип возвращаемых данных bool, int, float и др. Если указывается
void, то метод не возвращает данных. Далее определяется название, например, Start. После него в круглых скобках указываются параметры класса, через которые передаются входные данные.
Затем в фигурных скобках идет тело метода, включающее все исполняемые в методе операторы. В дальнейшем для простоты будем
методы называть функциями.
Синтаксис двух языков имеет определенные отличия, но есть
общие черты. Например, оба языка объектно-ориентированные,
операторы заканчиваются разделителем “;” и др.
Список использованных источников
1. Руководство по написанию скриптов для Unity3D, URL
http://unity3d.com/company/support/documentation;
2. Руководство по C#, URL http://www.realcoding.net/article/
view/1748.
22
Лабораторная работа № 3
«РАЗРАБОТКА ПРОСТЕЙШЕГО ИНТЕРФЕЙСА
ПРИЛОЖЕНИЯ»
Цель работы: Ознакомиться с начальными принципами создания и использования скриптов в Unity, разработать на основе примера свой интерфейс приложения.
Порядок выполнения лабораторной работы
Для начала необходимо создать пустой объект (GameObject>Create
Empty). Он появится в иерархии под названием Game Object, изменим его имя на Menu. Затем создаем собственно скрипт, который будет описывать работу меню. В окне Project нажимаем Create и выбираем язык, на котором будет написан скрипт:
С#/JavaScript/Boo. Особенностью использования скриптовых
языков в Unity является то, что из скрипта написанного на одном
языке нельзя обращаться к скриптам и переменным на другом
языке.
JavaScript:
Создаваемый интерфейс будет включать меню, которое будет
вызываться клавишей Escape и содержать три пункта: Resume,
Options и Exit. По клавише Resume меню должно закрываться.
По клавише Option могут быть размещены какие-либо настройки
(в данной лабораторной работе не предусмотрено). А клавиша Exit
отвечает за выход из приложения.
Вновь созданный скрипт называем Menu. По двойному клику по скрипту в окне Project открывается редактор скриптов
MonoDevelop-Unity. Для начала необходимо объявить переменные. Первые три будут отвечать за режим, в котором находится
приложение: игра, настройка или режим меню. Они будут иметь
тип boolean, так как в режиме можно либо находиться, либо нет.
Сделать это можно следующим образом:
var _menuMode : boolean = false;
var _gameMode : boolean = true;
var _optionsMode : boolean = false;
Можно предварительно установить, что изначально мы находимся в режиме игры, поэтому напротив соответствующего пункта
ставим – true, около остальных – false.
23
Затем создаем переменные для визуального отображения пунктов меню – это прямоугольники(Rect):
var Resume : Rect;
var Options : Rect;
var Quit : Rect;
Следующий шаг это создание функции, которая будет отслеживать и обрабатывать нажатие клавиши Escape и менять соответствующим образом режим. Назовем ее Update. Изначально мы
находимся в режиме игры (_gameMode) по первому нажатию клавиши Escape мы должны перейти в режим меню(_menuMode):
function Update()
{
if(Input.GetKeyDown(KeyCode.Escape))
{
_menuMode = true;
_gameMode = false;
_optionsMode = false;
}}
Далее в этой же функции описываем все существующие режимы: меню, игра, опции. Когда мы в режиме меню необходимо остановить игровое время, чтобы действие в игре не продолжалось. Для
этого меняем значение переменной timeScale на ноль. Также необходимо остановить камеру, чтобы она не продолжала следовать за
движениями мышки. Для этого обращаемся к соответствующим
скриптам (MouseLook) игровых объектов (First Person Controller
и Main Camera). Скрипт MouseLook отвечает за управление персонажем посредством мыши. Сделаем это путем создания локальной
переменной, присвоения ей значения игрового объекта и запрета
ее деятельности. Обратим внимание, что действия в режиме меню
и опций идентичны, значит их можно описать вместе:
if(!_gameMode && (_optionsMode || _menuMode))
{
Time.timeScale = 0;
var mPersLook = GameObject.Find(«First Person
Controller»).
GetComponent(«MouseLook»);
24
mPersLook.enabled = false;
var mCamLook= GameObject.Find(«Main Camera»).
GetComponent(«MouseLook»);
mCamLook.enabled = false;
}
Подобным же образом описываем действия для режима игры,
обращая внимание, что в режиме игры время и камеру необходимо
вновь запустить.
if(_gameMode && !_optionsMode && !_menuMode)
{
Time.timeScale = 1;
var mPersLook_1 = GameObject.Find(«First Person
Controller»).GetComponent(«MouseLook»);
mPersLook_1.enabled = true;
var mCamLook_1 = GameObject.Find(«Main Camera»).
GetComponent(«MouseLook»);
mCamLook_1.enabled = true;
}
Теперь приступим к описанию клавиш, действий при их нажатии и смену режимов. Нажатие клавиш происходит в режиме
_menuMode. В этом режиме должны отображаться необходимые
нам клавиши: Resume, Options и Exit. По нажатию Resume необходимо вернуться в режим игры. По нажатию Options перейти в режим опций. В данной лабораторной работе мы оставим опции пустыми и обратимся к ним позже. А по нажатию Exit выйти из приложения. Обратим внимание на то, что в режиме отладки в среде
Unity клавиша Exit действовать не будет. Листинг функции может
выглядеть следующим образом:
function OnGUI()
{
if(_menuMode)
{
if(GUI.Button(Resume, «Resume»))
{
_menuMode = false;
_gameMode = true;
_optionsMode = false;
25
}
if(GUI.Button(Options, «Options»))
{
_menuMode = false;
_gameMode = false;
_optionsMode = true;
}
if(GUI.Button(Quit, «Quit»))
{
Application.Quit();
}
}}
C#:
Создаваемый интерфейс будет включать меню, которое будет
вызываться клавишей Q и содержать три пункта: Game, Option
и Exit. По клавише Game выводятся кнопка возврата и кнопка выхода из меню Start. По клавише Option должны выводиться переключатель on и кнопка возврата в основное меню. А клавиша Exit
отвечает за выход из приложения.
Вновь созданный скрипт также называем Menu. По двойному
клику по скриту в окне Project открывается редактор скриптов
MonoDevelop-Unity. Изначально появится следующая заготовка
скрипта.
using UnityEngine;
using System.Collections;
public class Menu : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
Название public class должно совпадать с названием скрипта. Далее идет стандартная функция Start. Все действия которые ­будут описаны в данной функции будут выполнены в первую
26
очередь при активации объекта, к которому прикреплен скрипт.
­Затем располагается функция Update. Данная функция выполняется каждый кадр.
Для начала необходимо объявить переменные. Переменные
описываются перед функцией Start внутри public class. Первые три
будут отвечать за режим, в котором находится приложение: игра,
настройка или выход. А четвертая отвечает за состояние переключателя. Они будут иметь тип bool, так как в режиме можно либо
находиться, либо нет. Сделать это можно следующим образом:
bool Menu, GamePlay, Options;
bool On;
Можно сразу предустановить, что изначально мы находимся в режиме игры, поэтому напротив всех режимов ставим false
а у переключателя true.
Следующий шаг это создание функции, которая будет отслеживать, и обрабатывать нажатие, клавиши Escape и менять соответствующим образом режим. Изначально мы находимся в игровом
режиме, по первому нажатию клавиши Escape мы должны перейти в режим меню(menu) а время в игре должно остановиться:
void Update () {
if(Input.GetKeyDown(KeyCode.Q))
{
Menu=true;
Time.timeScale =0;
}
}
Далее в этой же функции описываем все существующие режимы: игра, опции, выход. Для начала зададим область и режим
прорисовки кнопок, функцией BeginArea и включим функцию
их центровки по вертикали BeginVertical. Для условия нажатия
каждой кнопки зададим состояния режимов. После окончания
создания кнопок отключим функцию центровки по вертикали
и режим прорисовки кнопок.
При задании условия работы режима меню, в начале камера
фиксируется, а при нажатии кнопок с переключением режима,
фиксация снимается. Данное действие повторяется в описаниях
работы всех режимов, чтобы при их переключении не оставались
27
следы отображения предыдущих режимов, а камера оставалась
­зафиксированной. Для описания этих действий создадим стандартную функцию void OnGUI(). В ней описываются действия
с графикой.
void OnGUI()
{if(Menu)
{
Camera.main.fieldOfView = 0;
GUILayout.BeginArea(new Rect(Screen.width/250,Screen.height/2-50,100,100));
GUILayout.BeginVertical();
if(GUILayout.Button(«Game»))
{
Menu=false;
GamePlay=true;
Camera.main.fieldOfView = 80;}
if(GUILayout.Button(«Option»))
{
Menu=false;
Options=true;
Camera.main.fieldOfView = 80;}
if(GUILayout.Button(«Exit»))
{
Application.Quit();
}
GUILayout.EndVertical();
GUILayout.EndArea();
}
Далее для работы режима игрового меню зададим альтернативное условие. Для расположения кнопки Start по центру воспользуемся методом выравнивания по горизонтали, заключенным в метод FlexibleSpace для задания дополнительной индивидуальной
настройки свойств кнопки. При нажатии кнопки Start игра продолжается, а при нажатии кнопки Back возвращаемся в основное
меню.
else if(GamePlay)
{
Camera.main.fieldOfView = 0;
GUILayout.BeginArea(new Rect(10,20,Screen.width20,Screen.height-20));
GUILayout.BeginVertical();
GUILayout.FlexibleSpace();
28
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
if(GUILayout.Button(«Start»,GUILayout.
Width(150),GUILayout.Height(100)))
{
Menu=false;
GamePlay= Options=false;
Time.timeScale =1;
Camera.main.fieldOfView = 80;
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
GUILayout.FlexibleSpace();
if(GUILayout.Button(«Back»,GUILayout.Width(100)))
{
GamePlay=false;
Menu=true;
Camera.main.fieldOfView = 80;
}
GUILayout.EndVertical();
GUILayout.EndArea();
Режим опции отличается от предыдущего тем, что вместо кнопки старта в центре находится переключатель. Элемент On зададим
как переключатель, и условно зададим блоки, в которых должны
располагаться действия для двух состояний переключателя.
else if(Options)
{
Camera.main.fieldOfView = 0;
GUILayout.BeginArea(new Rect(10,20,Screen.width20,Screen.height-20));
GUILayout.BeginVertical();
GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
On=GUILayout.Toggle(On,»on ?»);
if(On) {} //on
else {} //of
GUILayout.FlexibleSpace();
29
GUILayout.EndHorizontal();
GUILayout.FlexibleSpace();
if(GUILayout.Button(«Back»,GUILayout.Width(100)))
{ Options=false;
Menu=true;
Camera.main.fieldOfView = 80;}
GUILayout.EndVertical();
GUILayout.EndArea();
}
Общая часть:
Текст скрипта готов. Сохраняем его в редакторе (File>Save).
Переключаемся на Unity, ждем некоторое время, пока будет скомпилирован только, что написанный скрипт. О том, что идет компиляция говорит крутящийся кружок в нижнем правом углу окна
среды. Далее необходимо проверить нет ли в только, что созданном скрипте ошибок, для этого обратимся к логу расположенному
в нижней части окна среды (рис. 3.1).
Нажмем на это сообщение (рис. 3.2).
В данном случае среда отмечает повторяющееся имя переменной, что легко исправить задав новое имя (ошибка была сделана
Рис. 3.1. Сообщение об ошибке в окне среды Unity
Рис. 3.2. Список ошибок и их описание
30
специально, чтобы показать как она будет отображаться; в приведенном выше коде этой ошибки нет).
Затем необходимо указать, что игровому объекту Menu соответствует скрипт Menu. Для этого перетаскиваем мышкой скрипт
Menu из окна Project на игровой объект Menu в окне Hierarchy.
Теперь если выделить объект Menu, то в инспекторе можно найти
скрипт Menu (рис. 3.3). Для JavaScript необходимо провести настройку положения кнопок на экране.
Мы видим, что в настройках скрипта можно поменять текущий режим, а также настроить положение клавиш на экране. При
данных настройках и разрешении экрана 1920×1080 меню при за­
Рис. 3.3. Настройки объекта Menu (Java Script)
Рис. 3.4. Демонстрация меню (JavaScript)
31
пуске тестового выполнения в среде выглядит следующим образом
(рис. 3.4).
Вариант действия меню для C# представлен на рисунке 3.5.
При нажатии кнопки Start меню принимает следующий вид
(рис. 3.6), а при нажатии кнопки Option такой (рис. 3.7).
Индивидуальные задания
Контрольные вопросы:
1. Какие языки программирования используются для создания
скриптов в Unity3D?
2. С объектом, какого типа рекомендуется ассоциировать скрипт
меню?
Рис. 3.5. Демонстрация главного меню (C#)
Рис. 3.6. Демонстрация пункта меню Start
32
Рис. 3.7. Демонстрация пункта меню Option
3. Какими из имеющихся в сцене объектов управляет созданный для меню скрипт?
4. Какими средствами для мониторинга ошибок располагает
Unity3D?
5. Как настраивается расположение на экране клавиш меню?
Содержание отчета:
1. Цель работы;
2. Текст кода с комментариями;
3. Скриншот экрана с изображением клавиш меню и настроек
объекта меню в инспекторе;
4. Выводы.
Список использованных источников
1. Электронный учебник по программированию на С#, URL
http://msdn.microsoft.com/ru-ru/beginner/ee344863.aspx;
2. Видео урок по созданию меню на языке C#, URL http://www.
youtube.com/watch?v=3qCXQzRlh4s&feature=related ;
3. Руководство по написанию скриптов для Unity 3D, URL
http://unity3d.com/support/documentation/ScriptReference/
index.html;
4. Курс уроков по Unity3D от Flight Dream Studio/Alcatraz,
URL http://unity3d.ru/distribution/viewtopic.php?f=11&t=5048&
sid=1422449116a2037825c2c64ba4ea1a91.
33
Лабораторная работа № 4
«ЗНАКОМСТВО С АНИМАЦИЕЙ В СРЕДЕ UNITY»
Цель работы: Ознакомиться с простой анимацией в среде Unity
на примере создания облета сцены камерой.
Порядок выполнения лабораторной работы
В нашем проекте персонаж может свободно передвигаться по
предоставленной площади. Облет будет запускаться по нажатию
определенной клавиши. Для начала сделаем облет, а потом создадим скрипт, который будет обрабатывать нажатие клавиши для
инициализации анимации.
Выделим объект персонажа FirstPersonController в окне Hierarchy. Нажмем Windows>Animation. Появляется окно создания пошаговой анимации (рис. 4.1).
С помощью данного окна мы можем задать положение нашего персонажа в определенный момент времени. Нажимаем
на красный кружок, сохраняем анимацию в удобном месте и задаем ключевые точки, через которые будет происходить облет.
Для этого, установив ползунок времени в нужную секунду, передвигаем FirstPersonController. Процесс в целом схож с созданием анимации в других графических пакетах, таких как 3dsMax.
­Затем закрываем окно и переходим в окно инспектора для объекта
FirstPersonController. Там обращаем внимание на настройки анимации (рис. 4.2).
Ставим галку на Animate Physics, чтобы можно было управлять
камерой во время облета. Опробуем получившуюся анимацию.
После начала симуляции персонаж должен сразу начать облетать
Рис. 4.1. Окно Animation
34
Рис. 4.2. Настройки анимации облета
территорию по созданной траектории и свалиться на землю после
окончания облета.
Теперь создадим скрипт AnimationPlayer. Сделаем так, чтобы
облет начинался не сразу, а по нажатию определенной клавиши.
В данном случае это клавиша F.
JavaScript:
Создадим текстовую переменную. она будет выводить на экран
пользователя подсказку «Press F”:
var text1 : String = «Press F»;
Далее создадим функцию обработки нажатия клавиши и вызова функции обработки анимации:
function Update()
{
if(Input.GetKeyDown(KeyCode.F))
AnimationPlay();
}
Вызываем на проигрывание анимацию:
function AnimationPlay()
{
animation.Play(animation.clip.name);
}
Создаем на экране надпись с подсказкой:
function OnGUI()
{
GUI.Label(new Rect(100,100,200,30), text1);
}
35
Разбиение таких простых действий на отдельные функции может показаться нерациональным, но в последствии, при усложнении анимации, добавлении новых действий, клавиш и т.д. подобная структура поможет оперативно внести необходимые изме­
нения.
C#:
Cоздадим функцию обработки нажатия клавиши и вызова
функции обработки анимации:
using UnityEngine;
using System.Collections;
public class Animation : MonoBehaviour {
void Update () {
if(Input.GetKeyDown(KeyCode.E))
{
animation.Play();
}}}
Общая часть:
Сохраняем скрипт и перетаскиваем его на FirstPersonController.
В инспекторе убираем галку с пункта Play Automatically в настройках анимации для FirstPersonController. Теперь анимация вызывается по нажатию клавиши F (рис. 4.3).
Индивидуальные задания
Контрольные вопросы:
1. Расскажите о процессе создания пошаговой анимации в Unity3D.
Рис. 4.3. Облет сцены
36
2. Как настроить анимацию таким образом, чтобы персонаж
мог управлять камерой во время облета?
3. С помощью каких настроек можно включить проигрывание
анимации с самого начала сцены?
Содержание отчета:
1. Цель работы;
2. Текст кода с комментариями;
3. Скриншот экрана с иллюстрацией облета сцены и настроек
объекта анимации (FirstPersonController) в инспекторе;
4. Выводы.
Список использованных источников
1. Электронный учебник по программированию на С#, URL:
http://msdn.microsoft.com/ru-ru/beginner/ee344863.aspx;
2. Видео урок по созданию анимации на языке C#, URL: http://
www.youtube.com/watch?v=d4uWZGV6Xc0&feature=player_
embedded;
3. Руководство по написанию скриптов для Unity 3D, URL:
http://unity3d.com/support/documentationl;
4. Курс уроков по Unity3D от Flight Dream Studio/Alcatraz,
URL: http://unity3d.ru/distribution/viewtopic.php?f=11&t=5048
&sid=1422449116a2037825c2c64ba4ea1a91.
37
Лабораторная работа № 5
«РАЗРАБОТКА ОБЪЕКТА С ФИЗИЧЕСКИМИ СВОЙСТВАМИ,
ПОСТАНОВКА ЗВУКА»
Цель работы: Ознакомиться с базовыми понятиями физической
модели, используемой в Unity3d и созданием фонового звукового
сопровождения.
Порядок выполнения лабораторной работы
За придание объектам физических свойств отвечает вкладка
Component>Physics. В ней можно найти пункт Rigid body (твердое тело), с помощью него для любого объекта можно настроить
действие виртуальной гравитации. Кроме того, в этой же вкладке находятся несколько других модификаторов отвечающих за
настройку физических свойств. Среди них ряд модификаторов
collider. Они отвечают за создание твердой оболочки объекта.
Применяют их в случаях, когда производится экспорт модели из
другого редактора или просто создается новый объект и ему надо
придать твердость, т.е. сделать так, чтобы нельзя было пройти
сквозь них.
Для примера, в уже имеющейся сцене создадим куб
GameObject>Create Other>Cube. Разместим его в произвольном месте на некотором возвышении над поверхностью земли и нажмем Play. Куб так и останется висеть в указанном месте. Выйдем из режима проигрывания сцены, вернемся к ее
редактированию и применим к созданному кубу модификатор
Rigid Body (Component>Physics>Rigid Body). Теперь в инспекторе куба можно наблюдать настройки данного модификатора.
Для того, чтобы на куб действовала гравитация у него должна быть масса. Ставим произвольное значение в поле Mass, например 15 (при использовании метрической системы данный
показатель измеряется в кг.). Запустив сцену на выполнение,
наблюдаем за вполне реалистичным падением куба (кубов)
(рис. 5.1).
Для демонстрации применения элементарной физики сделаем
простой шутер от первого лица. Для этого добавим еще несколько произвольных объектов в сцену – шары, кубы др. Они будут
служить мишенями, по которым будет вестись огонь. Ко всем
мишеням добавим модификатор Rigid body и настроим его, придав объектам произвольные массы. Затем необходимо создать
38
Рис. 5.1. Падающий куб
оружие и патроны. Для этого создадим сферу, применим к ней
модификатор Rigid Body. Далее создадим префаб (prefab) в окне
проекта нажимаем Create>Prefab. Перетаскиваем из иерархии только что созданную сферу на префаб в окне проекта. Префаб это, своего рода, заготовка и если планируется использовать
какой-то объект несколько раз, то его помещают в префаб. При
применении каких-либо настроек или модификаторов в префабу
все эти настройки будут распространяться на все дочерние объекты этого префаба. Итак, созданный сфера-префаб будет служить
снарядом. Теперь необходимо написать скрипт, описывающий
работу оружия. Для этого создаем новый java-скрипт и вешаем
его на Main Camera, ­которая является подобъектом First Person
Controller.
Для реализации стрельбы необходимо, чтобы по нажатию левой
клавиши мыши создавался новый экземпляр сферы и запускался
в том направлении, куда смотрит пользователь. Создаем переменные снаряда и скорости.
JavaScript:
var projectile : Rigidbody;
var speed = 20;
Затем пишем функцию update, которая будет постоянно отслеживать действия пользователя и реагировать на них. Ставим условие нажатия клавиши (fire1 по умолчанию это левая клавиша
мыши, что можно проверить Editor>Project Settings>Input).
39
function Update()
{
if( Input.GetButtonDown( «Fire1» ) )
{
Мы объявляем переменные для хранения ссылки на объект, чьи
экземпляры вызываются. Тип переменной – Rigidbody, потому что
снаряд должен иметь физическое поведение. Для вызова экземпляра объекта используется функция Instantiate с тремя параметрами: объект для вызова, его местоположение и угол поворота.
var instantiatedProjectile : Rigidbody = Instantiate(projectile,
transform.position, transform.rotation);
Направляем объект в ту сторону, куда смотрит пользователь,
придавая ей скорость в данном направлении.
instantiatedProjectile.velocity = transform.TransformDirection
( Vector3( 0, 0, speed ) );
Отключаем столкновение с персонажем, иначе снаряд будет
ударяться об игрока при запуске.
Physics.IgnoreCollision( instantiatedProjectile. collider, transform.
root.collider );}}
Выбираем в иерархии First Person Controller>Main Camera, проверяем настройки созданного скрипта, например желаемую скорость снаряда. Затем необходимо назначить объект, который будет использоваться в качестве снаряда для этого перетаскиваем из
окна проекта префаб со сферой на переменную projectile (рис. 5.2).
В данном случае префаб снаряда назван – missle.
Проверяем в режиме play действие стрельбы (рис. 5.3). Помним, что массу куба и сферы-снаряда можно менять, добиваясь
различных эффектов при столкновении.
Рис. 5.2. Настройки стрельбы
40
Рис. 5.3. Демонстрация стрельбы
Рис. 5.4. Настройка источника звука в инспекторе
Для организации фонового звука необходимо задать источник
звука. Им может быть любой объект, с примененным компонентом Component>Audio>Audio Source. В инспекторе настраивается
музыкальная композиция, которая будет звучать. Предварительно музыкальный файл необходимо поместить в папку с проектом
(рис. 5.4). Для того, чтобы сделать какой-било объект слушателем
необходимо выполнить Component>Audio>Audio Listener. First
Person Controller, по умолчанию, является слушателем и применять эти действия к нему не надо.
41
Также возможна более сложная реализация, включающая
создание встроенного плеера с возможностью переключения музыкальных треков. Для этого необходимо создать пустой объект
(GameObject>Create Empty), назовем его MP3Player и повесим его
на First Person Controller. Затем напишем скрипт, описывающий
его работу. Удобнее всего это будет сделать на C#. Создаем новый
скрипт и называем его обязательно так же, как и только что созданный пустой объект, затем перетаскиваем скрипт на объект.
Приступаем к написанию скрипта. Подключаем модули и создаем класс для плейера, теперь его можно будет настраивать в инспекторе.
C#:
using UnityEngine;
using System.Collections;
public class MP3Player : MonoBehaviour {
public AudioSource player;
int currentTrack = 0;
public AudioClip[] tracks;
Здесь, AudioSource назначаемый источник звука, currentTrack –
номер текущего трека, AudioClip[] – аудио дорожки, которые можно будет выбрать в инспекторе. Обратим внимание, что название
public class’а должно совпадать с названием объекта.
Укажем номер трека, который будет играть по умолчанию при
включении плейера.
void Awake () {
player.clip = tracks[0]; }
С помощью функции update описываем старт и конец работы аудио плейера по нажатию клавиш “Z” и “X” соответственно. Также
задаем переключение треков вперед и назад клавишами “B” и “V”.
void Update ()
{
if (Input.GetKeyDown(KeyCode.Z))
player.Play();
if (Input.GetKeyDown(KeyCode.X))
player.Stop();
42
if (Input.GetKeyDown(KeyCode.B))
{
if (currentTrack < tracks.Length - 1)
currentTrack++;
else
currentTrack = 0;
SelectTrack(currentTrack);
player.Play();
}
else if(Input.GetKeyDown(KeyCode.V))
{
if (currentTrack > 0)
currentTrack--;
else
currentTrack = tracks.Length - 1;
SelectTrack(currentTrack);
player.Play();
}
}
Опишем вызываемую в update функцию SelectTrack. В ней проверяется, не выходит ли номер текущего трека за общее число треков и организуется последовательное проигрывание треков, начиная с текущего.
void SelectTrack(int index)
{
for (int cnt = 0; cnt < tracks.Length; cnt++)
{
if (cnt == index)
{
player.clip = tracks[cnt];
}
}
}
}
Наконец, необходимо настроить плеер в инспекторе (рис. 5.5).
Первым делом необходимо назначить источник звука – это может
быть любой объект сцены, после назначения музыка будет звучать
именно из него. Затем указываем число композиций, которые бу43
Рис. 5.5. Настройка плеера в инспекторе
дут воспроизводиться. После этого указываем, какие именно треки будут звучать.
Индивидуальные задания
Контрольные вопросы:
1. Какой модификатор отвечает за применение гравитации
к объекту?
44
2. Какой модификатор отвечает за твердость и невозможность
пройти сквозь объект?
3. Расскажите об использовании префабов.
4. Расскажите о процессе создания фонового звукового сопровождения.
Содержание отчета:
1. Цель работы;
2. Скриншоты, иллюстрирующие поведение физических объектов с настройками из инспектора;
3. Скриншоты с настройками музыкального сопровождения;
4. Выводы.
Список использованных источников
1. Урок для начинающих, включающий настройку простой физики, URL: http://habrahabr.ru/post/112287/;
2. McAllister Graham, «Creating a First Person Shooter (FPS)»
3. Руководство по написанию скриптов для Unity 3D, URL:
http://unity3d.com/support/documentation.
45
Лабораторная работа № 6
«РАЗРАБОТКА ИНТЕРАКТИВНОГО ОСВЕЩЕНИЯ»
Цель работы: Продолжить ознакомление с принципами создания и использования скриптов в Unity, разработать на основе примера и внедрить в имеющуюся сцену интерактивное освещение.
Порядок выполнения лабораторной работы
В данной лабораторной работе будет создан простой интерактивный источник света, а именно прожектор, управляемый
с помощью специального интерфейса. Также будет показан способ взаимодействия скриптов между собой с помощью функции
SendMessage().
Для начала создадим источник света spot light (GameObject >
Create other > Spotlight), разместим его в произвольном месте на
сцене. Для большей реалистичности можно добавить трехмерную модель корпуса осветительного прибора. Об импорте моделей
в Unity было рассказано в предыдущих лабораторных работах.
Далее создадим скрипт, который будет управлять источником
света. Назовем его, например, LightsControl. Перетащим вновь
созданный скрипт на источник света. Приступим к написанию
скрипта.
C#:
Интерфейс управления светом будет состоять из нескольких
кнопок и слайдера. Так как необходимо визуально контролировать
происходящие со светом изменения интерфейс будет налагаться
прямо на изображение сцены в реальном времени, без остановки
и выхода в меню. Появляется проблема управления. Для нажатия на клавиши и прокрутки слайдера должна использоваться
мышь, но она уже задействована в управлении камерой и при попытке сдвинуть курсор к краю экрана будет происходить поворот
камеры, что нежелательно, так как будет теряться из виду источник света. Для решения данной проблемы создадим специальный
режим управления светом. В нем мышь не будет управлять камерой, а будет использоваться только для управления интерфейсом
света.
В функции OnGUI создадим надпись, которая будет указывать
пользователю на то, как перейти в режим управления светом.
46
void OnGUI ()
{
GUI.Label(new Rect(25, 10, 300, 20), “Press L to turn on/
off light management mode”);
}
В функции Update сделаем обработчик нажатия соответствующей клавиши. Также используем специальную функцию
SendMessage. Она используется для посылки сообщения определенному игровому объекту с требованием сделать что-то. Т.е.
в данном случае игровому объекту, названному character, посылается сообщения найти у себя функцию Freeze и выполнить ее
с параметром CameraMode.Предварительно зададим переменные
для игрового объекта и режима работы камеры:
private bool CameraMode = false;
public GameObject character;
void Update () {
if (Input.GetKey((KeyCode.L)))
{
CameraMode = !CameraMode;
character.SendMessage(«Freeze», CameraMode);
}
Теперь обратимся к объекту, который скрыт за именем
character. Его можно задать в инспекторе, так как переменная
public. В качестве данного объекта будет выступать First Person
Controller. Движение камеры у него контролирует скрипт Mouse
Look. Чтобы “заморозить” камеру необходимо внести изменения
в данный скрипт, а именно добавить функцию, которая не даст
­камере двигаться вместе с мышкой.
Для этого скопируем содержимое скрипта Mouse Look в, созданный нами новый скрипт например CamMouseLook. За чувствительность камеры к движениям мыши отвечают переменные
sensitivityX и sensitivityY. На время работы со светом мы их просто обнулим. Добавим 2 новые переменные, которые понадобятся
для хранения старых значений чувствительности:
private float xsensitivityX;
private float xsensitivityY;
47
Также добавим функцию Freeze:
void Freeze (bool freeze)
{
if(freeze)
{
xsensitivityX = sensitivityX;
xsensitivityY = sensitivityY;
sensitivityX = 0;
sensitivityY = 0;}
else
{
sensitivityX = xsensitivityX;
sensitivityY = xsensitivityY;}
}
Она довольно простая. При ее вызове с параметром true значения чувствительности сохраняются в новых переменных и обнуляются. А при вызове с параметром false значения восстанавли­
ваются.
Заменим новым скриптом скрипт Mouse Look на First Person
Controller.
Создадим клавишу включения света. Для включения света используем один из параметров источника range. Изначально выставим его в значение 0. А по кнопке придадим ему нормальное значение. Внесем в скрипт LightsControl следующие дополнения:
private string TurnButtonText = “Turn on”;
private bool TurnButton = false;
public float lightRange = 100.0F;
void Start () {light.range = 0;}
void Update () {
if(TurnButton)
TurnButtonText = “Turn off the light”;
else
TurnButtonText = “Turn on the light”;
}
void OnGUI () {
if (CameraMode)
{
if (GUI.Button(new Rect(25, 40, 200, 30), TurnButton
Text))
48
{
if (!TurnButton)
light.range = lightRange;
else
light.range = 0;
TurnButton = !TurnButton;
}
}
}
Переменная TurnButtonText используется для хранения названия клавиши. В функцию Update внесены изменения, которые
­позволяют менять надпись в зависимости от того включен свет
или выключен. В функции Start выставлено изначальное значение для значения range. В таком положении свет выключен.
Далее добавим клавиши для поворота источника света. Для
­этого внесем соответствующие строчки в текст функции OnGUI,
а также добавим public переменную, в которой будет задаваться
­величина, на которую будет поворачиваться источник света.
public float rotationValue = 10.0F;
void OnGUI () {
if (CameraMode)
{
if (GUI.Button(new Rect(75, 100, 50, 50), «up»))
{
transform.Rotate(new Vector3(-rotationValue,
0, 0) * Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(75, 200, 50, 50), «down»))
{
transform.Rotate(new Vector3(rotationValue,
0, 0) * Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(25, 150, 50, 50), «left»))
{
transform.Rotate(new Vector3(0, -rotationValue, 0)
* Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(125, 150, 50, 50), «right»))
{
49
transform.Rotate(new Vector3(0, rotationValue, 0)
* Time.deltaTime, Space.World);
}
Для поворота вокруг оси используется функция transform.
Rotate. У которой есть параметры – вектор поворота – Vector3
­(поворот вокруг оси x, поворот вокруг оси y, поворот вокруг оси z).
Данный вектор умножается на значение Time.deltaTime, что означает, что действие будет происходить в зависимости от времени,
а не от кадра. Таким образом, движение будет плавным. Также
присутствует параметр Space.World необходимый для поворота
объекта в собственной системе координат.
Наконец создадим слайдер, с помощью которого будем изменять интенсивность света. Внесем следующие дополнения в текст
скрипта:
public float hSliderValue = 4.0F;
void Update () {
light.intensity = hSliderValue;}
void OnGUI () {
hSliderValue = GUI.HorizontalSlider(new Rect(25, 350,
200, 200), hSliderValue, 0.0F, 8.0F);}
Осталось только назначить в инспекторе public переменные.
В качестве character выбрать First Person Controller. На экране интерфейс управления светом выглядит следующим образом
(рис. 6.1).
Полный текст скрипта выглядит следующим образом:
using UnityEngine;
using System.Collections;
public class LightsControl : MonoBehaviour {
private string TurnButtonText = «Turn on»;
private bool TurnButton = false;
private bool CameraMode = false;
public float rotationValue = 10.0F;
public float hSliderValue = 5.0F;
50
Рис. 6.1. Интерфейс управления светом
public float lightRange = 100.0F;
public GameObject character;
void Start () {
light.range = 0;
}
void Update () {
if (Input.GetKey((KeyCode.L)))
{
CameraMode = !CameraMode;
haracter.SendMessage(«Freeze», Camera
Mode);
}
if(TurnButton)
TurnButtonText = «Turn off the light»;
else
TurnButtonText = «Turn on the light»;
light.intensity = hSliderValue;
}
51
void OnGUI () {
GUI.Label(new Rect(25, 10, 300, 20), «Press L to
turn on/off light management mode»);
if (CameraMode)
{
if (GUI.Button(new Rect(25, 40, 200, 30),
TurnButtonText))
{
if (!TurnButton)
light.range = lightRange;
else
light.range = 0;
TurnButton = !TurnButton;
}
if (GUI.Button(new Rect(75, 100, 50, 50), «up»))
{
transform.Rotate(newVector3(-rotation
Value,0, 0) * Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(75, 200, 50, 50),
«down»))
{
transform.Rotate(new
Vector3
(rotationValue, 0, 0) * Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(25, 150, 50, 50), «left»))
{
transform.Rotate(new Vector3(0, -rotation
Value, 0) * Time.deltaTime, Space.World);
}
if (GUI.Button(new Rect(125, 150, 50, 50),
«right»))
{
transform.Rotate(new
Vector3(0,
rotationValue, 0) * Time.deltaTime, Space.World);
}
hSliderValue = GUI.HorizontalSlider(new Rect
(25, 350, 200, 200), hSliderValue, 0.0F, 8.0F);
}}}
52
Индивидуальные задания
Контрольные вопросы:
1. Опишите механизм управления одним скриптом через другой с помощью функции SendMessage.
2. Какой скрипт отвечает за управление камерой в First Person
Controller?
3. С помощью какой функции можно вращать объектом?
4. Как создать слайдер?
Содержание отчета:
1. Цель работы;
2. Текст кода с комментариями;
3. Скриншот экрана с изображением интерфейса управления
светом и источником освещения;
4. Выводы.
Список использованных источников
1. Руководство по написанию скриптов для Unity3D, URL:
http://unity3d.com/support/documentation.
53
Лабораторная работа № 7
«РАЗРАБОТКА УСЛОЖНЕННОГО АУДИО ПЛЕЕРА»
Цель работы: Ознакомиться с принципами создания и использования скриптов в Unity, разработать на основе примера свой аудио плеер и скомпилировать общий .exe файл как итог выполнения всех лабораторных работ данного курса.
Порядок выполнения лабораторной работы
В данной лабораторной работе будет описан более сложный
и функциональный плеер, нежели был разобран в лабораторной
работе № 5. Описание включает: привязку источника звука, написание нового скрипта, привязку аудио треков. Новый плеер
может, как работать параллельно со старым, так и полностью его
­заменить.
Создаваемый плеер включает меню, которое будет вызываться
клавишей «P” и содержит кнопки: включение музыки, выключение музыки, выход из меню плеера, окно с отсчетом времени
до конца трека, окно регулировки громкости и набор кнопок для
выбора трека. По клавише “music on” включается музыка, по клавише “music off” музыка выключается, по клавише “back in game”
меню плеера закрывается. Окно “last time” и поле прокрутки под
ним показывают оставшееся время трека, окно “volume” показывает уровень громкости по шкале от 1 до 10, а вертикальное
поле прокрутки под ним служит регулятором самой громкости.
Десять клавиш с надписями “track”, соответствуют проигрываемым трекам, при нажатии происходит выбор трека и автомати­
ческий запуск.
Для удобства управления плеером введено управление с клавиатуры, не требующее открытия меню плеера. Для управления назначены клавиши:
– стрелки вправо и влево – переключение треков;
– стрелки вниз и вверх – регулировка громкости;
– правый Shift – запуск и остановка воспроизведения.
В первую очередь необходимо создать источник звука, для
этого выберем в разделе иерархии First Person Controller и подключим источник к нему (Component>Audio>AudioSource). Он появится в инспекторе под Audio Source, для предотвращения каких либо осложнений заранее снимите все флаги. Затем создаем
собственно скрипт, который будет описывать работу меню. В окне
54
Project нажимаем Create и выбираем язык, на котором будет написан скрипт – С#. Имя скриптового файла задайте Player.
C#:
Вновь созданный скрипт также называем Player. По двойному
клику по скрипту в окне Project открывается редактор скриптов
MonoDevelop-Unity. Для начала необходимо объявить переменные:
– bool Menu – отображение меню плеера;
– bool on – контроль включения и выключения меню плеера
с клавиатуры;
– bool play – контроль включения и выключения воспроизве­
дения с клавиатуры;
– public AudioClip w – пустая переменная аудио трека для выключения музыки (так как в скрипте много пунктов включения
музыки, для предотвращения ошибок вместо выключения музыки
задается пустой трек);
– int nt = 0 – переменная с номером трека из списка;
– public AudioClip[] q – массив для аудио треков;
– public float sliderValue = 1.0F – начальная переменная для
­задания поля прокрутки громкости;
– public float rValue = 1.0F – начальная переменная для задания поля оставшегося времени воспроизведения трека;
– public float d – переменная контроля общей длины аудио трека в секундах;
– public float t – переменная контроля текущего времени проигрывания аудио трека;
– public string[] selStrings – массив для создания выборки клавиш (списка треков).
Сделать это можно следующим образом:
using UnityEngine;
using System.Collections;
public class AudioPlayer : MonoBehaviour {
bool Menu;
bool on;
bool play;
public AudioClip w;
int nt = 0;
55
public AudioClip[] q;
public float sliderValue = 1.0F;
public float rValue = 1.0F;
public float d;
public float t;
public string[] selStrings = new string[] {«track 1», «track 2»,
«track 3», «track 4», «track 5», «track 6», «track 7», «track 8», «track 9»,
«track 10»};
Можно предварительно установить, что изначально мы находимся в режиме игры, поэтому можно сразу задать стартовое значение некоторых переменных.
void Start () {
audio.clip = w;
Menu=false;
on=true;
}
Зададим функцию Update, которая должна содержать условия
для обработки команд, поступающих с клавиатуры (кроме контроля громкости) и обновление переменных “d” и “t”. Также опишем
работу цикла переключения трека по окончанию текущего, т. е.
как только заканчивается текущий трек, включается новый, а по
окончанию списка треков он начинается сначала.
void Update () {
if(Input.GetKeyDown(KeyCode.P))
{
Menu=on;
on=true;
}
if (Input.GetKeyDown(KeyCode.RightShift))
{
if(play)
{
audio.clip = w;
audio.Play();
play=false;
}
else
{
56
audio.clip = q[nt];
audio.Play();
play=true;
}
}
if(Input.GetKeyDown(KeyCode.RightArrow))
{
if (nt < q.Length - 1)
{
nt++;
audio.clip = q[nt];
audio.Play();
}
else
{
nt = 0;
audio.clip = q[nt];
audio.Play();
}
}
if(Input.GetKeyDown(KeyCode.LeftArrow))
{
if (nt > 0)
{
nt--;
audio.clip = q[nt];
audio.Play();}
else
{
nt = q.Length - 1;
audio.clip = q[nt];
audio.Play();}
}
d=audio.clip.length;
t=audio.time;
if (!audio.isPlaying) {
if (nt < q.Length - 1)
{
nt++;
audio.clip = q[nt];
audio.Play();}
else
{
nt = 0;
57
audio.clip = q[nt];
audio.Play();} }
Далее с помощью метода OnGUI зададим три первых клавиши
меню плеера.
void OnGUI()
{
if(Menu)
{
on=false;
GUILayout.BeginArea(new Rect(0, 0, 300, 30));
GUILayout.BeginHorizontal();
if(GUILayout.Button(«music on»))
{
audio.clip=q[nt];
audio.Play();
}
if(GUILayout.Button(«music off»))
{
audio.clip = w;
}
if(GUILayout.Button(«back in game»))
{
Menu=false;
}
GUILayout.EndHorizontal();
GUILayout.EndArea();
Далее здесь же зададим окно громкости и вертикальное поле
прокрутки громкости, которое будет отсылать на контроллер
­громкости источника звука его новое значение с шагом изменения
0.1 и пределами от 0 до 1. Также здесь прописан контроль громкости с клавиатуры, но уже с шагом изменения громкости 0,2.
(sliderValue));
58
GUILayout.BeginArea(new Rect(800,0, 200, 200));
GUILayout.BeginVertical();
GUILayout.FlexibleSpace();
GUILayout.Box(«Volume:» + Mathf.Round
sliderValue = GUILayout.VerticalSlider(slider
Value, 0.0F, 10);
if(Input.GetKeyDown(KeyCode.UpArrow))
{if (audio.volume < 1)
{sliderValue=sliderValue+1;}}
if(Input.GetKeyDown(KeyCode.DownArrow))
{ if (audio.volume > 0)
{
sliderValue=sliderValue-1;
}}
audio.volume=Mathf.Round(sliderValue)/10;
GUILayout.EndVertical();
GUILayout.EndArea();
Аналогично настройке контроллера громкости задаем индикатор времени до окончания воспроизведения аудио трека.
GUILayout.BeginArea(new Rect(0,31, 400, 60));
GUILayout.BeginVertical();
GUILayout.FlexibleSpace();
GUILayout.Box(«last time:» + (d-Mathf.Round(rValue)));
rValue = GUILayout.HorizontalSlider(t, 0.0F, d);
GUILayout.EndVertical();
GUILayout.EndArea();
По окончании работы меню плеера задаются условия для срабатывания клавиш выбора трека. Данные условия повторяют друг
друга, за исключением изменяющегося названия сработавшей
кнопки и соответствующего ей аудио трека, который будет запущен по нажатию, поэтому далее представлены условия для срабатывания первой клавиши, а остальные предлагается дописать
­самостоятельно в зависимости от того, сколько треков вы хотите
вывести на выбор.
GUILayout.BeginArea(new Rect(400,0, 400, 800));
if( GUILayout.Button(«track 1» )){
nt=0;
audio.clip = q[nt];
audio.Play();}
GUILayout.EndArea();
}}
59
Рис. 7.1. Подключение треков
Текст скрипта готов. Сохраняем его в редакторе (File>Save).
­ ереключаемся на Unity, ждем некоторое время, пока будет ском­
П
пилирован только что написанный скрипт.
Перед дальнейшей работой с плеером следует внести в проект аудио треки, которые будут далее подключены к плееру. Для
этого берем любые аудио файлы, которые вы захотите (желательно в формате .ogg) и копируем их в папку проекта или попросту
перетаскиваем их в окно проекта в Unity.
После компиляции скрипта перетаскиваем его из окна проекта
в окно иерархии на First Person Controller. В инспекторе должен
появиться блок скрипта, в котором следует задать размер для переменной Q (количество аудио треков, которые будут подключены),
а затем назначить каждый трек. Остальные настройки оставить
как показано на рисунке 7.1.
Теперь можно запускать игру, в которой можно увидеть созданное меню плеера (рис. 7.2).
По настройки и проверки плеера, необходимо собрать все выполненные ранее лабораторные работы в один проект. Далее
необходимо проверить клавиши, на которые назначены действия скриптов во избежание параллельного срабатывания. Затем, следует скомпилировать готовое приложение. Для этого
зайдите в меню настройки компиляции (File>Build Settings)
и в открывшемся окне (рис. 7.3) выберете пункт “PC and MAC
Standalone” (также в данном окне можно увидеть под какие еще
60
операционные системы и платформы можно скомпилировать
проект).
Для компиляции текущей сцены выберите «Add Current”.
В окне “Scenes in build” появится название текущей сцены. В пункте “Target Platform” выберете “Windows” с правильной разряд-
Рис. 7.2. Демонстрация меню плеера
Рис. 7.3. Окно настройки компиляции
61
ностью (32 или 64). Также можно произвести дополнительные настройки компиляции, нажав “Player Settings”. По окончании настройки нажмите “Build”, выберите место для размещения и имя
приложения. В течение пары минут Unity скомпилирует готовый
к автономному запуску .exe файл. На этом завершается курс лабораторных работ по Unity3D. Желаем успехов в дальнейшем освоении данной платформы.
Индивидуальные задания
Контрольные вопросы:
1. Какой формат аудио записей предпочтителен для использо­
вания в Unity3D?
2. Какими из имеющихся в сцене объектов управляет созданный для меню скрипт?
3. Как работает алгоритм переключения трека по окончанию
­текущего?
4. С помощью, каких команд настраиваются параметры воспроизведения звука?
5. Под какие платформы и операционные системы можно создавать проекты?
Содержание отчета:
1. Цель работы;
2. Текст кода с комментариями;
3. Скриншот экрана с изображением клавиш меню плеера и настроек объекта плеера в инспекторе;
4. Выводы;
5. Скомпилированный exe файл проекта.
Список источников
1. Электронный учебник по программированию на С#, URL:
http://msdn.microsoft.com/ru-ru/beginner/ee344863.aspx;
2. Руководство по написанию скриптов для Unity3D, URL:
http://unity3d.com/support/documentation.
62
СОДЕРЖАНИЕ
Введение......................................................................................... 3
Лабораторная работа № 1
“Разработка ландшафта, постановка общего освещения”....................... 8
Лабораторная работа № 2
«Импорт моделей в приложение, постановка локального
освещения»................................................................................... 17
Лабораторная работа № 3
«Разработка простейшего интерфейса приложения»........................... 23
Лабораторная работа № 4
«Знакомство с анимацией в среде Unity»........................................... 34
Лабораторная работа № 5
«Разработка объекта с физическими свойствами, постановка звука»..... 38
Лабораторная работа № 6
«Разработка интерактивного освещения».......................................... 46
Лабораторная работа № 7
«Разработка усложненного аудио плеера»......................................... 54
63
64
Документ
Категория
Без категории
Просмотров
0
Размер файла
3 734 Кб
Теги
nikitin, zhirnov
1/--страниц
Пожаловаться на содержимое документа