- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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.5. Собственные трехмерные модели 103
Итак, вы узнали, как смоделировать настоящее небо! Скайбокс предлагает вам элегантный способ создать иллюзию бескрайнего пространства вокруг игрока. Следующим шагом по совершенствованию внешнего вида сцены станет получение более сложных трехмерных моделей.
4.5. Собственные трехмерные модели
В предыдущем разделе мы накладывали текстуры на большие плоские стены и пол. А что делать с более детализированными объектами? Предположим, мы хотим обставить комнаты мебелью. Для решения этой задачи нам потребуется внешнее приложение для работы с трехмерной графикой. Вспомните определение, которое было дано в начале этой главы: трехмерные модели — это помещенные в игру сеточные объекты (то есть трехмерные фигуры). В этом разделе мы импортируем в игру сетку, имеющую форму скамейки.
Для моделирования трехмерных объектов широко применяются такие приложения, как Maya от Autodesk и 3ds Max. Но это дорогие коммерческие инструменты, поэтому мы воспользуемся приложением с открытым исходным кодом, которое называется Blender. Скачанный с сайта проект включает в себя файл с расширением
.blend, которым вы можете воспользоваться; рис. 4.14 демонстрирует модель скамейки в программе Blender. На случай, если вы захотите научиться моделировать такие объекты собственными руками, в приложение В включено упражнение по созданию скамейки.
М а
, а а а
Рис. 4.14. Модель скамейки в программе Blender
Кроме моделей, созданных лично вами или сотрудничающим с вами художником, можно скачивать подходящие варианты со специальных сайтов. К примеру, существует такой замечательный ресурс, как Asset Store: https://www.assetstore.unity3d.com.
4.5.1. Выбор формата файла
Созданную в приложении Blender модель требуется экспортировать. Как и в случае с двухмерными изображениями, существует множество разных форматов экспорта, каждый из которых обладает своими достоинствами и недостатками. Поддерживаемые в Unity форматы трехмерных файлов перечислены в табл. 4.3.
104 Глава 4. Работа с графикой
Таблица 4.3. Форматы файлов трехмерных моделей, поддерживаемые в Unity
Формат |
Достоинства и недостатки |
|
|
FBX |
Сетки и анимация; рекомендуемый формат |
|
|
Collada (DAE) |
Сетки и анимация; еще один хороший вариант, если формат FBX недоступен |
|
|
OBJ |
Только сетки; это текстовый формат, который иногда используется для |
|
трансляции в Интернет |
|
|
3DS |
Только сетки; достаточно старый и примитивный формат |
|
|
DXF |
Только сетки; достаточно старый и примитивный формат |
|
|
Maya |
Работает через FBX; требует установки этого приложения |
|
|
3ds Max |
Работает через FBX; требует установки этого приложения |
|
|
Blender |
Работает через FBX; требует установки этого приложения |
|
|
Выбор варианта сводится к поддержке анимации. Так как единственными удовлетворяющими этому условию вариантами являются Collada и FBX, выбирать приходится между ними. Когда есть такая возможность (не все инструменты для работы с трехмерной графикой экспортируют данные в этом формате), лучше всего пользоваться форматом FBX, в противном случае подойдет и формат Collada. К счастью, приложение Blender допускает экспорт файлов в формате FBX.
Обратите внимание, что в нижней части табл. 4.3 перечислено несколько приложений для работы с 3D-графикой. Инструмент Unity позволяет прямо переносить их файлы в ваши проекты, что сначала кажется удобным, но эта функциональность имеет несколько подводных камней. Во-первых, Unity не загружает непосредственно сами файлы. Модель загружается в фоновом режиме, затем загружается экспортированный файл. Но так как модель в любом случае экспортируется в формате FBX или Collada, лучше делать это в явном виде. Во-вторых, для подобной операции у вас должно быть установлено соответствующее приложение. Если вы планируете организовать доступ к файлам с разных компьютеров (например, для группы разработчиков), это обстоятельство становится большой проблемой. Я не рекомендую загружать файлы из приложения Blender (или Maya, или еще откуда-то) напрямую в Unity.
4.5.2. Экспорт и импорт модели
Итак, пришло время экспортировать модель из Blender и импортировать ее в Unity. Первым делом откройте файл со скамейкой в приложении Blender и выберите в меню File команду Export FBX. Сохраненный файл импортируйте в Unity тем же способом, которым осуществлялся импорт изображений. Перетащите FBX-файл на вкладку Project или щелкните на этой вкладке правой кнопкой мыши и выберите команду Import New Asset. Трехмерная модель будет скопирована в Unity-проект, готовая к вставке в сцену.
ПРИМЕЧАНИЕ В доступный для скачивания пример проекта включен файл с расширением .blend, чтобы вы могли попрактиковаться в экспорте FBX-файлов из приложения Blender; даже если вы не хотите ничего моделировать самостоятельно, зачастую требуется конвертировать скачанные файлы в доступный для Unity формат. Если вы предпочитаете пропустить все шаги, связанные с приложением Blender, задействуйте имеющийся FBX-файл.
4.5. Собственные трехмерные модели 105
При импорте моделей желательно сразу же поменять несколько параметров. Unity масштабирует импортируемые модели до очень маленьких размеров (на рис. 4.15 показано, что вы увидите на панели Inspector, выделив такую модель), поэтому введите в поле Scale Factor значение 100, чтобы частично скомпенсировать параметр File Scale, равный 0.01. Можно также установить флажок Generate Colliders (генерировать коллайдеры), но это не обязательно; просто без коллайдера персонажи смогли бы проходить сквозь скамейку. Затем перейдите на вкладку Animation в параметрах импорта и сбросьте флажок Import Animation (импорт анимации) — ведь эту модель мы анимировать не будем.
Ра а
а ,
а а а а 100
|
О |
|
а а• , |
П а |
а а а а |
• • |
|
а , |
а |
|
|
• • • а |
|
Рис. 4.15. Редактирование параметров импорта трехмерной модели |
|
Это обеспечит нам корректный импорт сетки. Теперь что касается текстуры; при импорте FBX-файла инструмент Unity заодно создал материал для скамейки. По умолчанию он пустой (как любой новый материал), поэтому назначьте ему текстуру (показанную на рис. 4.16) тем же способом, каким вы назначали текстуру кирпича стене: перетащите изображение на вкладку Project, чтобы импортировать его в Unity, а затем — на ячейку текстуры в настройках материала скамейки. Изначально изображение будет выглядеть странновато, его разные части окажутся на разных частях скамейки, поэтому текстурные координаты были отредактированы для приведения изображения в соответствие с сеткой.
И а
« а »
К а
В
Рис. 4.16. Двухмерное изображение, служащее текстурой для скамейки
ОПРЕДЕЛЕНИЕ Текстурными координатами (texture coordinates) называется дополнительный набор значений для каждой вершины, проецирующий полигоны на области текстуры. Представьте, что трехмерная модель — это ящик, а текстура — оберточная бумага. Текстурные координаты будут указывать, на какую из сторон ящика должен накладываться каждый фрагмент бумаги.