- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
4.2. Создание геометрической модели сцены 91
поэтому она рассматривается в следующих главах). Вам же предстоит построить сцену, в которой фигурируют двухмерные изображения, трехмерные модели, материалы и система частиц. В некоторых случаях вы будете пользоваться уже готовыми графическими ресурсами, импортируя их в Unity, но будут и ситуации (особенно с системой частиц), когда графический ресурс придется создавать с нуля.
В этой главе мы только слегка затронем тему создания игровой графики. Все-таки эта книга посвящена в основном программированию в Unity, поэтому подробное рассмотрение вопросов, связанных с графикой, уменьшит количество информации по главной теме. Создание игровой графики — огромная предметная область, для детального описания которой потребуется не одна книга. В большинстве случаев программисты работают в паре со специалистами по графике. Принимая во внимание сказанное, человек, занимающийся программированием игр, должен понимать, как Unity работает с графическими ресурсами, и, возможно, даже уметь создавать их грубые заменители; их еще называют программистской графикой (programmer art) и позднее (в готовой игре) заменяют нужными графическими ресурсами.
ПРИМЕЧАНИЕ Проекты из предыдущей главы для выполнения заданий вам не потребуются. Воспользуйтесь сценариями движения из главы 2, чтобы получить возможность перемещаться по сцене; при необходимости можно взять модель игрока и сценарии из скачанного с сайта проекта. К концу этой главы вы создадите движущиеся объекты, напоминающие полученные в предыдущих главах.
4.2. Создание геометрической модели сцены
Разговор о моделировании сцен мы начнем с рассмотрения процесса создания геометрической модели сцены (whiteboxing). Обычно это первый шаг моделирования уровня с помощью компьютера (следующий за разработкой этого уровня на бумаге). Как следует из английского термина, объекты сцены создаются из набора примитивов, то есть белых ящиков (white boxes). В списке различных ресурсов пустые декорации соответствуют базовому виду трехмерной модели и являются основой для отображения двухмерных картинок. Вспомните сцену, которую мы создали из примитивов в главе 2. Это и есть геометрическая модель (просто на тот момент вы еще не знали этого термина). В некоторых разделах вы найдете отсылки к вещам, которые мы делали в начале главы 2, но на этот раз я буду касаться их совсем коротко, попутно сократив обсуждение новой терминологии.
ПРИМЕЧАНИЕ В английском языке также используется термин grayboxing (gray boxes — серые ящики). Он также означает геометрическую модель сцены, но я предпочитаю слово whiteboxing, потому что узнал его раньше. Реальный цвет примитивов может различаться, точно так же, как светокопии, называемые «синьками» (blueprints), далеко не всегда имели синий цвет.
4.2.1. Назначение геометрической модели
Составление сцены из примитивов практикуется по двум причинам. Во-первых, это позволяет быстро получить «набросок», который со временем будет постепенно совершенствоваться. Эта деятельность близко связана с проектированием игровых уровней.
92 Глава 4. Работа с графикой
ОПРЕДЕЛЕНИЕ Проектирование уровней (level design) — это дисциплина, касающаяся планирования и создания в игре сцен (или уровней). Проектировщик уровней — это тот, кто занимается проектированием уровней.
По мере увеличения количества разработчиков в группе и сужения специализации каждого отдельного члена группы создание первой версии каждого игрового уровня в виде геометрической модели отдается на откуп проектировщикам уровней. Затем эта заготовка передается специалистам по графике для визуальной доработки. Но даже в маленькой группе, где за проектирование уровней и работу с графикой может отвечать один и тот же человек, такая последовательность действий является оптимальной. В конце концов, нужно с чего-то начинать, а геометрическая модель становится хорошей основой для создания визуальных эффектов.
Второй причиной использования геометрических моделей является возможность быстро привести сцену в подходящее для игры состояние. Она может быть не окончена (более того, уровень, на котором построена только геометрическая модель, очень далек от завершения), но это уже функциональная версия, поддерживающая игровой процесс. Как минимум, игрок в состоянии перемещаться по сцене (вспомните демонстрационный ролик из главы 2). Можно провести тестирование и убедиться, что игровой уровень построен корректно (например, комнаты имеют подходящий для игры размер), и только после этого тратить время и энергию на его проработку. Если окажется, что чего-то не хватает (скажем, вы поняли, что требуется больше места), несложно внести изменения и провести повторное тестирование на стадии геометрической модели.
Более того, возможность поиграть даже на стадии конструирования уровня хорошо поднимает моральный дух. Не сбрасывайте это преимущество со счетов. Создание богатой в визуальном отношении сцены может занять долгое время, и вы почувствуете усталость от того, что никак не можете воспользоваться плодами своего труда. Геометрическая модель сразу дает вам готовый (хотя и примитивный) игровой уровень и возможность играть в постоянно совершенствующуюся игру.
Итак, теперь, когда вы понимаете, почему разработки всех уровней начинаются с геометрических моделей, давайте приступим к созданию игры!
4.2.2. Рисуем план уровня
Созданию игрового уровня на компьютере предшествует его проектирование на бумаге. Мы не будем подробно обсуждать тему проектирования уровней; достаточно сделанного в главе 2 примечания по поводу проектирования игр. Проектирование уровней (представляющее собой разновидность проектирования игр) — это обширная область знаний, достойная отдельной книги. Мы же нарисуем базовый план уровня, чтобы обозначить цель, к которой нужно стремиться.
Рисунок 4.1 демонстрирует вид сверху простого помещения, состоящего из четырех комнат и центрального коридора. Это все, что нам на данный момент нужно: набор отдельных областей и внутренние стены, которые требуется установить на свои места. План реальной игры будет содержать больше деталей, например таких, как враги и фрагменты обстановки. Попрактиковаться в создании геометрической модели сцены можно как на примере этого плана, так и взяв за основу собственные идеи. Конкретное
4.2. Создание геометрической модели сцены 93
расположение комнат в этом упражнении не имеет значения. Важно только наличие у вас нарисованного плана, что позволит перейти к следующему этапу.
С а |
На а а |
|
|
|
|
|
|
|
Рис. 4.1. План игрового уровня: четыре комнаты и центральный коридор
4.2.3. Расставляем примитивы в соответствии с планом
Построение геометрической модели сцены в соответствии с имеющимся планом включает в себя позиционирование и масштабирование множества параллелепипедов, которые будут играть роль стен. Как описано в разделе 2.2.1, выберите в меню GameObject команду 3D Object, а затем команду Cube, чтобы получить куб для дальнейших преобразований.
ПРИМЕЧАНИЕ При желании вместо кубов вы можете воспользоваться объектом QuadsBox, скачанным вместе с проектом. Он представляет собой куб, созданный из шести частей, что дает дополнительную гибкость при назначении материала. Выбор в данном случае зависит только от вашего желания; лично я не стал пользоваться объектом QuadsBox, так как вся геометрия со временем все равно заменяется графикой.
Первым объектом сцены станет пол; на панели Inspector поменяйте имя примитива и его положение по координате Y на –0.5, как показано на рис. 4.2. Это делается для компенсации высоты объекта. Затем растяните куб по осям X и Z.
И а
П а |
|
( а |
Ма а а |
а |
X Z |
) |
|
Рис. 4.2. Параметры куба на панели Inspector после перемещения и масштабирования