- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
114 Глава 5. Игра Memory на основе новой 2D-функциональности
и написание сценариев, которые затем присоединяются к объектам. Основной вид ресурсов, необходимых для создания двухмерной графики, называется спрайтом.
ОПРЕДЕЛЕНИЕ Спрайты (sprites) представляют собой отображаемые непосредственно на экране двухмерные изображения, в то время как такие же изображения, отображаемые на поверхности трехмерных моделей, называются текстурами.
Импорт спрайтов по большей части напоминает импорт текстур (см. главу 4). С технической точки зрения спрайты представляют собой объекты в трехмерном пространстве, обладающие плоской поверхностью и ориентированные относительно оси Z. Так как все они повернуты в одном направлении, камеру можно нацелить прямо на них, в результате игрокам будут видимы только перемещения вдоль осей X и Y (то есть в плоскости).
В главе 2 мы обсудили координатные оси: для получения третьего измерения добавляется ось Z, перпендикулярная уже знакомым вам осям X и Y. Именно этими осями представлены два измерения, с которыми мы будем работать.
5.1. Подготовка к работе с двухмерной графикой
Мы собираемся воспроизвести классическую игру Memory. Опишем ее для тех, кто не знаком с правилами. Набор парных карт раскладывается рубашкой вверх. Расположение карт игроку неизвестно. Он может перевернуть любые две карты, пытаясь найти совпадающие. Если открытые карты не совпали, они переворачиваются назад, а игрок делает следующую попытку.
На рис. 5.1 показан макет этой игры; сравните его с планом, который мы составляли в главе 2.
|
С : 1 |
С — |
К а а а |
а а |
|
Ка а а а а
а а
Рис. 5.1. Макет игры Memory
Обратите внимание, что на этот раз макет воспроизводит именно то, что увидит играющий (в то время как макет трехмерной сцены описывает пространство вокруг игрока и местоположение камеры, обеспечивающей возможность смотреть по сторонам).
5.1. Подготовка к работе с двухмерной графикой 115
Теперь, когда вы знаете, что мы собираемся создавать, пришло время приступить к делу!
5.1.1. Подготовка проекта
Первым делом нужно собрать и отобразить всю графику. Практически тем же способом, которым раньше создавался трехмерный демонстрационный ролик, мы начнем новую игру с помещения в сцену игровых объектов, после чего приступим к программированию их функциональности.
Это означает, что нужно создать все представленное на рис. 5.1: рубашку карт, их лицевую сторону, табло отображения количества набранных очков в одном углу игрового пространства и кнопку перезагрузки в другом. Кроме того, нам потребуется фон. Весь необходимый арсенал показан на рис. 5.2.
Р а а а |
Ф |
|
( а а а) |
Л а а а (4 а• • а)
К а а а а
Рис. 5.2. Графические ресурсы для игры Memory
СОВЕТ Как обычно, готовую версию проекта со всеми графическими ресурсами можно скачать со страницы www.manning.com/hocking сайта, посвященного этой книге. Вы можете скопировать предоставленные изображения и использовать их в своем проекте.
Соберите все требуемые изображения и создайте в Unity новый проект. В нижней части появившегося окна вы увидите пару кнопок, позволяющих переключаться между режимами 2D и 3D (рис. 5.3). В предыдущих главах вы работали только с трехмерной графикой, а так как именно этот режим создания проектов используется по умолчанию, мы не обращали на данную настройку внимания. Сейчас же нам нужно переключиться в режим работы с двухмерной графикой.
К а
а
а 2D
Рис. 5.3. Эти кнопки позволяют создавать как двухмерные, так и трехмерные проекты
116 Глава 5. Игра Memory на основе новой 2D-функциональности
РЕЖИМ 2D ДЛЯ РЕДАКТОРА И ВКЛАДКИ SCENE
Кнопка 2D/3D при создании нового проекта меняет настройки редактора Unity, которые при желании можно поменять вручную. Это режим работы самого редактора и режим отображения вкладки Scene. Последний определяет способ показа сцены в Unity; кнопка перехода между режимами находится в верхней части вкладки Scene.
К а а 2D
Кнопка, меняющая режим отображения на вкладке Scene
Для изменения режима работы редактора откройте меню Edit, наведите указатель мыши на строку Project Settings и выберите в дополнительном меню вариант Editor. Среди различных настроек на панели Inspector вы увидите раскрывающийся список Default Behavior Mode, в котором можно выбрать вариант 3D или 2D.
М а а а а а
Список Default Behavior Mode, открываемый командой Edit Project Settings Editor
В режиме 2D все изображения импортируются как спрайты; в главе 4 вы видели, что в обычном режиме они превращаются в текстуры. Кроме того, в режиме 2D сцены лишены настроек освещения. Оно в данном случае просто не требуется. Если когда-нибудь вы захотите удалить освещение из трехмерной сцены, удалите автоматически создаваемый источник света и отключите скайбокс (щелкните на маленьком кружочке рядом с полем выбора файла и выберите в списке вариант None).
Итак, мы создали новый проект, выбрав для него режим 2D. Пришло время добавить в сцену наши изображения.
5.1.Подготовка к работе с двухмерной графикой 117
5.1.2.Отображение двухмерных изображений (спрайтов)
Выполните импорт всех изображений, перетащив их на вкладку Project; убедитесь, что изображения импортированы как спрайты, а не как текстуры. Для этого выделите любую картинку и посмотрите настройки ее импорта на панели Inspector. Нас интересует поле Texture Type. Теперь перетащите спрайт table_top (наше фоновое изображение) с вкладки Project в пустую сцену. Сохраните сцену. Как и в случае с сеточными объектами, на панели Inspector окажется компонент Transform для данного спрайта; присвойте его полям значения 0, 0, 5 для изменения положения фонового изображения.
СОВЕТ Есть еще одна настройка импорта, на которую следует обратить внимание, — это Pixels To Units. Так как в Unity раньше был трехмерный движок, к которому недавно добавили двухмерную графику, одна единица в Unity далеко не всегда соответствует одному пикселу изображения. Вы можете выбрать для этой настройки вариант 1:1, но лично я рекомендую оставить заданное по умолчанию значение 100:1 (так как физический движок при отображении варианта 1:1 работает не совсем корректно, а вариант, предлагаемый по умолчанию, обеспечивает лучшую совместимость с другим кодом).
АНИМИРОВАННЫЕ СПРАЙТЫ
Для данного проекта мы будем использовать только статичные изображения, но в двухмерных играх повсеместно распространены анимированные спрайты. Они создаются рисованием каждого кадра анимации и последующего воспроизведения полученной последовательности кадров вUnity.
Кадры можно импортировать в виде отдельных изображений, но обычно их выкладывают в виде одной картинки, которая называется листом спрайтов (sprite sheet). Листы спрайтов можно автоматически генерировать в Unity или пользоваться для их создания такими инструментами, как Texture Packer (см. приложение Б). При импорте листа в списке Sprite Mode настроек спрайта следует выбрать вариант Multiple.
На а , а а
а Unity
В а • а
а
а
а а Multiple
Импорт листа спрайтов в Unity
Лист спрайтов появляется на вкладке Project как один ресурс, но щелчок на расположенной сбоку стрелке раскрывает его и дает возможность увидеть отдельные спрайты. Вместо того чтобы перетаскивать спрайты в сцену по одному за раз, можно перетащить их группой.
118 Глава 5. Игра Memory на основе новой 2D-функциональности
Понять, почему мы приравняли к 0 координаты X и Y, несложно — наш спрайт должен заполнить весь экран, поэтому его нужно расположить в центре, но присвоение значения 5 координате Z может показаться странным. Разве для двухмерной графики имеют значение какие-либо координаты, кроме X и Y? Разумеется, только эти координаты определяют положение плоского объекта на экране; а координата Z вступает в дело, если нам нужно положить объекты друг на друга. Меньшие значения координаты Z заставляют спрайты располагаться ближе к камере, поэтому спрайты с такой координатой оказываются поверх прочих объектов (рис. 5.4). Соответственно, у спрайта, служащего фоном, значение координаты Z должно быть максимальным. Мы присвоили ему положительную координату Z, а все остальные объекты будут иметь нулевую или отрицательную координату Z.
П а а |
|
|
Т а• ( а•) • |
а |
|
||
|
|
||
( а ) |
|
С а |
|
|
|
|
О Z
Рис. 5.4. Расположение спрайтов относительно оси Z
Положение остальных спрайтов будет указываться с точностью до двух знаков после запятой из-за упоминавшегося ранее параметра Pixels To Units. Соотношение 100:1 означает, что 100 пикселов изображения соответствуют 1 измерительной единице в Unity; или, если посмотреть с другой стороны, 1 пиксел равен 0,01 единицы. Однако перед размещением в сцене дополнительных спрайтов настроим камеру.
СОЗДАНИЕ АТЛАСОВ
Как упоминалось во врезке «Анимированные спрайты», набор спрайтов можно превратить в одно изображение. В случае, когда таким способом комбинируются кадры двухмерной анимации, такой набор называется листом спрайтов. Но для подобной структуры существует еще один, более общий термин — атлас (atlas).
Листы спрайтов используют для хранения кадров анимации, атласы же зачастую применяются для статичных изображений. Дело в том, что они двумя способами оптимизируют производительность: во-первых, уменьшая количество пустого пространства в изображениях путем их плотной упаковки; во-вторых, уменьшая количество вызовов прорисовки (draw calls) видеокарты (каждое новое загруженное изображение означает дополнительную работу видеокарты).
Для создания атласов спрайтов применяются внешние инструменты (после импорта в настройках спрайта нужно выбрать вариант Multiple), и это прекрасно работает. Но в Unity существует упаков-