- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 1. Знакомство с Unity
- •1.1. Достоинства Unity
- •1.1.1. Сильные стороны и преимущества Unity
- •1.1.2. Недостатки, о которых нужно знать
- •1.1.3. Примеры игр на основе Unity
- •1.2. Как работать с Unity
- •1.2.1. Вкладка Scene, вкладка Game и панель инструментов
- •1.2.2. Работа с мышью и клавиатурой
- •1.2.3. Вкладка Hierarchy и панель Inspector
- •1.2.4. Вкладки Project и Console
- •1.3. Готовимся программировать в Unity
- •1.3.1. Запуск кода в Unity: компоненты сценария
- •1.3.2. Программа MonoDevelop — межплатформенная среда разработки
- •1.4. Заключение
- •Глава 2. Создание 3D-ролика
- •2.1. Подготовка…
- •2.1.1. Планирование проекта
- •2.1.2. Трехмерное координатное пространство
- •2.2. Начало проекта: размещение объектов
- •2.2.1. Декорации: пол, внешние и внутренние стены
- •2.2.2. Источники света и камеры
- •2.2.3. Коллайдер и точка наблюдения игрока
- •2.3. Двигаем объекты: сценарий, активирующий преобразования
- •2.3.1. Схема программирования движения
- •2.3.2. Написание кода
- •2.3.3. Локальные и глобальные координаты
- •2.4. Компонент сценария для осмотра сцены: MouseLook
- •2.4.1. Горизонтальное вращение, следящее за указателем мыши
- •2.4.2. Поворот по вертикали с ограничениями
- •2.4.3. Одновременные горизонтальное и вертикальное вращения
- •2.5. Компонент для клавиатурного ввода
- •2.5.1. Реакция на нажатие клавиш
- •2.5.2. Независимая от скорости работы компьютера скорость перемещений
- •2.5.4. Ходить, а не летать
- •2.6. Заключение
- •3.1. Стрельба путем бросания лучей
- •3.1.1. Что такое бросание лучей?
- •3.1.2. Имитация стрельбы командой ScreenPointToRay
- •3.1.3. Добавление визуальных индикаторов для прицеливания и попаданий
- •3.2. Создаем активные цели
- •3.2.1. Определяем точку попадания
- •3.2.2. Уведомляем цель о попадании
- •3.3. Базовый искусственный интеллект для перемещения по сцене
- •3.3.1. Диаграмма работы базового искусственного интеллекта
- •3.3.2. «Поиск» препятствий методом бросания лучей
- •3.3.3. Слежение за состоянием персонажа
- •3.4.1. Что такое шаблон экземпляров?
- •3.4.2. Создание шаблона врага
- •3.4.3. Экземпляры невидимого компонента SceneController
- •3.5. Стрельба путем создания экземпляров
- •3.5.1. Шаблон снаряда
- •3.5.2. Стрельба и столкновение с целью
- •3.5.3. Повреждение игрока
- •3.6. Заключение
- •Глава 4. Работа с графикой
- •4.1. Основные сведения о графических ресурсах
- •4.2. Создание геометрической модели сцены
- •4.2.1. Назначение геометрической модели
- •4.2.2. Рисуем план уровня
- •4.2.3. Расставляем примитивы в соответствии с планом
- •4.3. Наложение текстур
- •4.3.1. Выбор формата файла
- •4.3.2. Импорт файла изображения
- •4.3.3. Назначение текстуры
- •4.4. Создание неба с помощью текстур
- •4.4.1. Что такое скайбокс?
- •4.4.2. Создание нового материала для скайбокса
- •4.5. Собственные трехмерные модели
- •4.5.1. Выбор формата файла
- •4.5.2. Экспорт и импорт модели
- •4.6. Системы частиц
- •4.6.1. Редактирование параметров эффекта
- •4.6.2. Новая текстура для пламени
- •4.6.3. Присоединение эффектов частиц к трехмерным объектам
- •4.7. Заключение
- •5.1. Подготовка к работе с двухмерной графикой
- •5.1.1. Подготовка проекта
- •5.1.2. Отображение двухмерных изображений (спрайтов)
- •5.1.3. Переключение камеры в режим 2D
- •5.2. Создание карт и превращение их в интерактивные объекты
- •5.2.1. Создание объекта из спрайтов
- •5.2.2. Код ввода с помощью мыши
- •5.2.3. Открытие карты по щелчку
- •5.3. Отображение различных карт
- •5.3.1. Программная загрузка изображений
- •5.3.3. Создание экземпляров карт
- •5.3.4. Тасуем карты
- •5.4. Совпадения и подсчет очков
- •5.4.1. Сохранение и сравнение открытых карт
- •5.4.2. Скрытие несовпадающих карт
- •5.4.3. Текстовое отображение счета
- •5.5. Кнопка Restart
- •5.5.1. Добавление к компоненту UIButton метода SendMessage
- •5.5.2. Вызов метода LoadLevel в сценарии SceneController
- •5.6. Заключение
- •Глава 6. Двухмерный GUI для трехмерной игры
- •6.1. Перед тем как писать код…
- •6.1.1. IMGUI или усовершенствованный 2D-интерфейс?
- •6.1.2. Выбор компоновки
- •6.1.3. Импорт изображений UI
- •6.2. Настройка GUI
- •6.2.1. Холст для интерфейса
- •6.2.2. Кнопки, изображения и текстовые подписи
- •6.2.3. Управление положением элементов UI
- •6.3. Программирование интерактивного UI
- •6.3.1. Программирование невидимого объекта UIController
- •6.3.2. Создание всплывающего окна
- •6.3.3. Задание значений с помощью ползунка и поля ввода
- •6.4. Обновление игры в ответ на события
- •6.4.1. Интегрирование системы сообщений
- •6.4.2. Рассылка и слушание сообщений сцены
- •6.4.3. Рассылка и слушание сообщений проекционного дисплея
- •6.5. Заключение
- •7.1. Корректировка положения камеры
- •7.1.1. Импорт персонажа
- •7.1.2. Добавление в сцену теней
- •7.1.3. Облет камеры вокруг персонажа
- •7.2. Элементы управления движением, связанные с камерой
- •7.2.1. Поворот персонажа лицом в направлении движения
- •7.2.2. Движение вперед в выбранном направлении
- •7.3. Выполнение прыжков
- •7.3.1. Добавление вертикальной скорости и ускорения
- •7.3.2. Распознавание поверхности с учетом краев и склонов
- •7.4. Анимация персонажа
- •7.4.1. Создание анимационных клипов для импортированной модели
- •7.4.2. Создание контроллера для анимационных клипов
- •7.4.3. Код, управляющий контроллером-аниматором
- •7.5. Заключение
- •8.1. Создание дверей и других устройств
- •8.1.1. Открывание и закрывание дверей
- •8.1.2. Проверка расстояния и направления перед открытием двери
- •8.1.3. Управление меняющим цвет монитором
- •8.2. Взаимодействие с объектами путем столкновений
- •8.2.1. Столкновение с препятствиями, обладающими физическими свойствами
- •8.2.2. Управление дверью с помощью триггера
- •8.2.3. Сбор разбросанных по игровому уровню элементов
- •8.3. Управление инвентаризационными данными и состоянием игры
- •8.3.1. Настраиваем диспетчеры игрока и инвентаря
- •8.3.2. Программирование диспетчеров
- •8.3.3. Сохранение инвентаря в виде коллекции: списки и словари
- •8.4. Интерфейс для использования и подготовки элементов
- •8.4.1. Отображение элементов инвентаря в UI
- •8.4.2. Подготовка ключа для открытия двери
- •8.4.3. Восстановление здоровья персонажа
- •8.5. Заключение
- •9.1. Создание натурной сцены
- •9.1.1. Генерирование неба с помощью скайбокса
- •9.1.2. Настройка управляемой кодом атмосферы
- •9.2. Скачивание сводки погоды из Интернета
- •9.2.1. Запрос веб-данных через сопрограмму
- •9.2.2. Парсинг текста в формате XML
- •9.2.3. Парсинг текста в формате JSON
- •9.2.4. Изменение вида сцены на базе данных о погоде
- •9.3. Добавление рекламного щита
- •9.3.1. Загрузка изображений из Интернета
- •9.3.2. Вывод изображения на щите
- •9.3.3. Кэширование скачанного изображения
- •9.4. Отправка данных на веб-сервер
- •9.4.1. Слежение за погодой: отправка запросов POST
- •9.4.2. Серверный код в PHP-сценарии
- •9.5. Заключение
- •Глава 10. Звуковые эффекты и музыка
- •10.1. Импорт звуковых эффектов
- •10.1.1. Поддерживаемые форматы файлов
- •10.1.2. Импорт аудиофайлов
- •10.2. Воспроизведение звуковых эффектов
- •10.2.1. Система воспроизведения: клипы, источник, подписчик
- •10.2.2. Присваивание зацикленного звука
- •10.2.3. Активация звуковых эффектов из кода
- •10.3. Интерфейс управления звуком
- •10.3.1. Настройка центрального диспетчера управления звуком
- •10.3.2. UI для управления громкостью
- •10.3.3. Воспроизведение звуков UI
- •10.4. Фоновая музыка
- •10.4.1. Воспроизведение музыкальных циклов
- •10.4.2. Отдельная регулировка громкости
- •10.4.3. Переход между песнями
- •10.5. Заключение
- •Глава 11. Объединение фрагментов в готовую игру
- •11.1. Построение ролевого боевика изменением назначения проектов
- •11.1.1. Сборка ресурсов и кода из разных проектов
- •11.1.2. Элементы наведения и щелчка
- •11.1.3. Замена старого GUI новым
- •11.2. Разработка общей игровой структуры
- •11.2.1. Управление ходом миссии и набором уровней
- •11.2.2. Завершение уровня
- •11.2.3. Проигрыш уровня
- •11.3. Обработка хода игры
- •11.3.1. Сохранение и загрузка достижений игрока
- •11.3.2. Победа в игре при прохождении всех уровней
- •11.4. Заключение
- •Глава 12. Развертывание игр на устройствах игроков
- •12.1. Создание приложений для настольных компьютеров: Windows, Mac и Linux
- •12.1.1. Построение приложения
- •12.1.2. Настройки проигрывателя: имя и значок приложения
- •12.1.3. Компиляция в зависимости от платформы
- •12.2. Создание игр для Интернета
- •12.2.1. Проигрыватель Unity и HTML5/WebGL
- •12.2.2. Создание файла Unity и тестовой веб-страницы
- •12.2.3. Обмен данными с JavaScript в браузере
- •12.3. Сборки для мобильных устройств: iOS и Android
- •12.3.1. Настройка инструментов сборки
- •12.3.2. Сжатие текстур
- •12.3.3. Разработка подключаемых модулей
- •12.4. Заключение
- •Приложение А. Перемещение по сцене и клавиатурные комбинации
- •А.1. Навигация с помощью мыши
- •А.2. Распространенные клавиатурные комбинации
- •Б.1. Инструменты программирования
- •Б.1.1. Visual Studio
- •Б.1.2. Xcode
- •Б.1.3. Android SDK
- •Б.1.4. SVN, Git или Mercurial
- •Б.2. Приложения для работы с трехмерной графикой
- •Б.2.1. Maya
- •Б.2.3. Blender
- •Б.3. Редакторы двухмерной графики
- •Б.3.1. Photoshop
- •Б.3.2. GIMP
- •Б.3.3. TexturePacker
- •Б.4. Звуковое программное обеспечение
- •Б.4.1. Pro Tools
- •Б.4.2. Audacity
- •Приложение В. Моделирование скамейки в программе Blender
- •В.1. Создание сеточной геометрии
- •В.2. Назначение материала
142 Глава 6. Двухмерный GUI для трехмерной игры
Первым делом перетащите все изображения на вкладку Project, чтобы импортировать их в редактор, а затем на панели Inspector убедитесь, что у каждого из них параметр Texture Type имеет значение Sprite (2D And UI).
ВНИМАНИЕ Параметр Texture Type в трехмерных проектах по умолчанию принимает значение Texture, а в двухмерных — Sprite. Если вам требуются спрайты для трехмерного проекта, этот параметр нужно отредактировать вручную.
Все изображения, показанные на рис. 6.3, есть в скачанном примере проекта.
close |
enemy |
gear |
popup |
Э а |
Э а |
Э а а |
Э а |
а а |
а а |
а |
а а а |
а а |
а |
а |
|
|
|
|
а а |
Рис. 6.3. Изображения, необходимые для текущего проекта
Убедитесь, что все импортированные ресурсы являются спрайтами; вам, скорее всего, потребуется отредактировать у них параметр Texture Type.
Спрайты включают в себя кнопки, индикатор счета и всплывающее окно, которое вам предстоит создать. Теперь, когда они импортированы в проект, расположим графику на экране.
6.2. Настройка GUI
В качестве графических ресурсов выступает уже знакомая нам по главе 5 разновидность двухмерных спрайтов, просто на этот раз мы будем использовать их немного по-другому. В Unity есть специальные инструменты, которые вместо демонстрации изображений в составе сцены превращают их в проекционный дисплей, отображаемый поверх трехмерной сцены. Кроме того, есть особые приемы размещения UIэлементов, обусловленные тем фактом, что на разных экранах фрагменты интерфейса зачастую отображаются по-разному.
6.2.1. Холст для интерфейса
Одним из наиболее фундаментальных и при этом неочевидных аспектов функционирования системы UI является необходимость связать все изображения с холстом.
СОВЕТ Холст (canvas) представляет собой специальный вид объектов, который Unity визуализирует как UI для игр.
Откройте меню GameObject, чтобы увидеть перечень доступных для создания объектов, и в категории UI выберите вариант Canvas. В сцене появится холст (для ясности
6.2. Настройка GUI 143
присвойте ему имя HUD Canvas). Этот объект растянут на весь экран и сильно связан с трехмерной сценой, так как масштабирует один пиксел экрана в одну единицу измерения сцены.
ВНИМАНИЕ Вместе с холстом автоматически создается объект EventSystem. Он требуется для UI-взаимодействий, в остальных же случаях его можно просто игнорировать.
Переключитесь в режим 2D, как показано на рис. 6.4, и дважды щелкните на имени холста на вкладке Hierarchy, чтобы уменьшить масштаб этого объекта и увидеть его целиком. Двухмерный режим включается автоматически для всех 2D-проектов, но в случае 3D-проекта переход между UI и основной сценой осуществляется при помощи переключателя. Для возвращения к просмотру трехмерной сцены отключите режим 2D и дважды щелкните на строке Building, чтобы отмасштабировать объект.
О-
а а Scene.
О
а а а , а а а а
• UI.
Г а • а
а а • , •
• а - € ‚ а
Д •€ „ :
• • а€ ‚ „
а • € -а†€,
UI-‚ а
Ц •
а • а а • а• ,
Rect
НЕ а . О • а
•€
- Unity; •
-а
- а
Рис. 6.4. Пустой холст на вкладке Scene
СОВЕТ Хочу напомнить вам совет из главы 4: в верхней части вкладки Scene располагаются кнопки, управляющие видимостью различных элементов, поэтому найдите кнопку Effects, чтобы отключить видимость скайбокса.
У холста есть ряд доступных для редактирования параметров. Прежде всего, это параметр Render Mode, которому следует оставить значение, предлагаемое по умолчанию. Для него возможны следующие значения:
Screen Space-Overlay — визуализация элементов UI как наложенной поверх вида с камеры двухмерной графики (предлагается по умолчанию).
Screen Space-Camera — элементы UI также визуализируются поверх вида с камеры, но могут поворачиваться, создавая эффекты перспективы.
World Space — холст помещается в сцену, что делает элементы UI частью трехмерной сцены.
144 Глава 6. Двухмерный GUI для трехмерной игры
Последние два режима применяются для создания специальных эффектов, но имеют несколько более сложную реализацию по сравнению с режимом, предлагаемым по умолчанию.
Еще одной важной настройкой является флажок Pixel Perfect. После его установки положение изображений в процессе визуализации слегка корректируется с целью придать им четкий и контрастный вид (в отличие от размывания). Установите этот флажок, и холст готов к размещению спрайтов.
6.2.2. Кнопки, изображения и текстовые подписи
Объект-холст задает область, которая будет отображаться как UI, но туда следует добавить спрайты, соответствующие отдельным элементам. В соответствии с макетом на рис. 6.2 у нас есть изображение блока/врага в верхнем левом углу и рядом с ним текст, отображающий набранные очки, а также кнопка в виде шестерни в верхнем правом углу. В разделе UI меню GameObject есть команды, позволяющие создать изображение (Image), текст (Text) или кнопку (Button). Создайте по одному элементу каждого вида.
Для корректного отображения UI-элементы должны быть потомками объекта-хол- ста. В Unity эта иерархическая связь возникает автоматически, но напомню, что подобные зависимости можно формировать и вручную, перетаскивая объекты на вкладке Hierarchy (рис. 6.5).
О-
О-а
( а-а
а а Hierarchy)
Рис. 6.5. Холст и связанное с ним изображение на вкладке Hierarchy
Между расположенными на холсте объектами также можно сформировать иерархические связи с целью их более удобного размещения. Например, можно перетащить текст на изображение, чтобы надпись перемещалась вместе с картинкой. Более того, у создаваемой по умолчанию кнопки есть дочерний по отношению к ней текстовый объект; в данном случае подпись на кнопке не требуется, поэтому просто удалите его.
Перетащите элементы UI на предназначенные им места. В следующем разделе мы зададим их точное положение, пока же это не имеет особого значения. Указателем мыши перетащите объект-изображение в верхний левый угол холста, а кнопку — в верхний правый.
СОВЕТ Как уже упоминалось в главе 5, в режиме 2D активируется инструмент Rect. Я описывал его как средство, включающее в себя все три преобразования: перемещение, поворот и масштабирование. В режиме 3D эти операции выполняются отдельными инструментами, но при переходе к работе с двухмерными объектами они объединяются, так как у нас пропадает одно измерение. В режиме 2D этот инструмент выбирается автоматически, кроме того, можно активировать его щелчком на кнопке в верхнем левом углу Unity.
6.2. Настройка GUI 145
Пока оба элемента пусты. Если выделить объект UI и посмотреть на панель Inspector, в верхней части свитка Image вы увидите поле Source Image. Как показано на рис. 6.6, перетащите на это поле спрайты (ни в коем случае не текстуры!) с вкладки Project. Назначьте спрайт с изображением врага объекту-изображению, а спрайт с изображением шестерни — объекту-кнопке. Для обеспечения корректного размера спрайтов щелкните на кнопке Set Native Size.
1. П а а а
Project Source Image…
2. … … ‚ аˆ • € € •а ‰ † • UI
3. Щ • •а • Set Native Size€ ‚ ƒ • € • „ а…† а
а а
Рис. 6.6. Назначение двухмерных спрайтов свойству Image UI-элементов
Это обеспечит нужный внешний вид картинки с изображением врага и кнопки настроек. У текстового объекта также существует множество параметров, отображаемых на панели Inspector. Первым делом введите какое-нибудь число в большое поле Text; позднее это значение будет переопределено, пока же введенная информация выглядит в редакторе как индикатор набранных очков. Увеличьте размер текста, присвоив параметру Font Size значение 24 и выбрав в раскрывающемся списке Font Style вариант Bold. При этом горизонтально эта текстовая подпись должна быть выровнена по левому краю, а вертикально — по центру, как показано на рис. 6.7. Остальным параметрам мы пока оставим значения, предлагаемые по умолчанию.
О UI а а
,
И • • • TrueType
‚
Э а
а а а а
а а
Рис. 6.7. Настройки текстового элемента UI
ПРИМЕЧАНИЕ Кроме содержимого поля Text и выравнивания чаще всего редактируется свойство Font (шрифт). В Unity можно импортировать шрифт TrueType и выбрать его на панели Inspector.