- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
В.2. Назначение материала 331
В.2. Назначение материала
На поверхности трехмерных моделей можно отображать двухмерные изображения, называемые текстурами. В случае больших плоских поверхностей процесс назначения материала очевиден; достаточно растянуть его по поверхности. А что делать с моделями более сложной формы? Здесь нам на помощь приходит такое понятие, как текстурные координаты.
Эти координаты определяют положение различных точек текстуры относительно сетки. Фактически, с их помощью сеточные элементы проецируются на области текстуры. Представьте себе оберточную бумагу, как показано на рис. В.8; трехмерная модель — это заворачиваемый в бумагу ящик, текстура — бумага, а координаты показывают, какая сторона бумаги придется на конкретную грань ящика. Они задают на двухмерной картинке точки и фигуры; эти фигуры соответствуют полигонам сетки, благодаря чему части изображения появляются на фрагментах сетки.
Я |
Я , а а |
О а а а
Т а
а а
,
а а ( а
а а а UV, а XY)
Рис. В.8. Оберточная бумага хорошо иллюстрирует принцип работы текстурных координат
СОВЕТ Еще текстурные координаты называют UV-координатами. Это название появилось изза того, что текстурные координаты обозначаются буквами U и V, в то время как для обозначения координат трехмерной модели используются буквы X, Y и Z.
Процесс совмещения фрагментов одной сущности с фрагментами другой называется проецированием (mapping) — соответственно, термин текстурное проецирование
(texture mapping) обозначает процесс создания текстурных координат. Из аналогии с оберточной бумагой родилось еще одно название этого процесса — распаковывание (unwrapping). Есть также термины, образованные смешением обоих понятий,
332 Приложение В. Моделирование скамейки в программе Blender
например UV-распаковывание (UV unwrapping); вам надо постараться не запутаться в многочисленных, по существу, синонимичных понятиях, связанных с текстурным проецированием.
Сам по себе процесс текстурного проецирования достаточно сложен, но, к счастью, приложение Blender оснащено инструментами, превращающими его в рутинную процедуру. Первым делом нужно определить швы; если снова представить процесс упаковывания ящика в бумагу (точнее, лучше представить обратный процесс — распаковывание), становится понятно, что далеко не каждая часть трехмерной фигуры при превращении ее в плоскость остается бесшовной. И там, где фрагменты этой фигуры расходятся в стороны, появляются швы. Приложение Blender позволяет выделять ребра, объявляя их швами.
Переключитесь в режим выделения ребер (см. кнопки на рис. В.4) и выделите ребра с внешней стороны нижней части скамейки. Далее выберите в меню Mesh команду Edges и затем — Mark Seam, как показано на рис. В.9. После этого Blender отделит нижнюю часть скамейки с целью проецирования текстур. Проделайте ту же операцию для сторон скамейки, но полностью их не разделяйте. Вместо этого превратите в швы только ребра, идущие вверх по ножкам; в этом случае стороны сохранят соединение со скамейкой, но раскроются, как крылья.
В • • а
В
а Mark Seam
Т
а а а
а
а а
а а
а
В • а
• •
•
Рис. В.9. Ребра вдоль нижней части скамейки и вдоль ножек превращаются в швы
Пометив все швы, воспользуйтесь командой Texture Unwrap. Для начала выделите сетку целиком (не забудьте невидимую для вас обратную сторону объекта). Затем выберите в меню Mesh команду UV Unwrap Unwrap, чтобы сгенерировать текстурные координаты. Но пока вы их не увидите, так как по умолчанию Blender демонстрирует трехмерное отображение сцены. Для просмотра текстурных координат нужно переключиться в UV-редактор, воспользовавшись крайним слева меню панели инструментов, которое называется Viewports (вам нужно не слово View, а маленький значок, показанный на рис. В.10).
В.2. Назначение материала 333
К а а Export UV Layout
Т а ,
а а
а а
Рис. В.10. Чтобы увидеть текстурные координаты, смените 3D View на UV Editor
После этого вы увидите полигоны скамейки, разложенные на плоскости, отделенные друг от друга и раскрытые по указанным вами швам. Для раскраски текстуры эти UV-координаты должны быть видимы в программе редактирования изображений. Снова обратимся к рис. В.10: выберите в меню UVs команду Export UV Layout и сохраните изображение под именем bench.png (именно это имя будет использоваться для импорта в Unity).
Откройте это изображение в графическом редакторе и раскрасьте части текстуры в разные цвета. Благодаря UV-координатам эти цвета окажутся на соответствующих гранях. Например, на рис. В.11 темно-синим цветом окрашена нижняя часть скамейки, а красным — ее боковые стороны. Теперь изображение можно вернуть в программу Blender и использовать в качестве текстуры для нашей модели — для этого выберите в меню Image команду Open Image.
UV Editor а
а • Open • Image
Э а а
UV-а Ра а
Рис. В.11. Раскрасьте экспортированное UV-изображение и верните текстуру в Blender
334 Приложение В. Моделирование скамейки в программе Blender
Теперь можно вернуться к трехмерному представлению (с помощью того же самого меню, которым мы пользовались для переключения в редактор UV-координат). Текстура на модели все еще не видна, но это легко исправить. Достаточно удалить присутствующий в сцене по умолчанию источник света и включить отображение текстур в окне проекции, как показано на рис. В.12.
3. Г !
1. В Object mode а
а ( а )
2. В•• • Viewport Shading а а Texture
Рис. В.12. Отображение текстуры на поверхности модели
Чтобы удалить источник света, первым делом вернитесь в режим работы с объектами и выделите его (используйте меню, при помощи которого вы переходили в режим редактирования). Нажмите клавишу X для удаления выделенного объекта. Наконец, выберите в меню Viewport Shading команду Texture. В окне проекции появится готовая скамейка с назначенной ей текстурой!
Сохраните модель. Blender по умолчанию сохраняет файлы с расширением .blend, то есть в собственном формате. Воспользуйтесь именно этим форматом, чтобы корректно сохранить все функциональные особенности модели Blender. Позднее вам потребуется экспортировать модель в файл другого формата, предназначенный для импорта в Unity. Обратите внимание, что изображение текстуры вместе с моделью не сохраняется; сохраняется ссылка на него, но вам по-прежнему требуется сам графический файл.