
- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала

246 Глава 10. Звуковые эффекты и музыка
поэтому для нее выбирайте вариант Vorbis (это название аудиоформата со сжатием). Короткие звуковые клипы в сжатии не нуждаются, поэтому выбирайте для них вариант PCM (Pulse Code Modulation — импульсно-кодовая модуляция). Третий вариант — ADPCM — является вариацией PCM и дает несколько более качественный звук.
Раскрывающийся список Load Type позволяет указать, каким образом компьютер будет загружать данные из файла. Так как объем памяти у компьютера ограничен, а аудиофайлы могут быть очень большими, иногда имеет смысл запустить воспроизведение звука в процессе его передачи в память, избавляя компьютер от необходимости единовременно загружать весь файл. Однако такая передача звука требует затрат вычислительных ресурсов, поэтому быстрее всего воспроизводятся файлы, предварительно загруженные в память. Но даже в этом случае вы можете выбрать, будут ли данные представлены в сжатой форме или их следует распаковать для более быстрого воспроизведения. Так как наши аудиоклипы имеют небольшой размер, воспроизведение в процессе загрузки нам не требуется, поэтому можно выбрать вариант
Decompress On Load.
Итак, в нашем проекте появились импортированные и готовые к использованию аудиофайлы.
10.2. Воспроизведение звуковых эффектов
Теперь, когда вы добавили к проекту звуковые файлы, вы, разумеется, хотите, чтобы они звучали. Код активации звуковых эффектов понять несложно, но аудиосистема в Unity состоит из разных частей, которые должны работать согласованно.
10.2.1. Система воспроизведения: клипы, источник, подписчик
Возможно, вы ожидаете, что для проигрывания звука в Unity достаточно указать, какие клипы нужно воспроизводить, но на самом деле для этого нужно задать три компонента: AudioClip, AudioSource и AudioListener. Подобное разделение связано с поддержкой в Unity трехмерного звука: различные компоненты сообщают Unity информацию о местоположении, которая используется для управления трехмерным звуком.
2D- И 3D-ЗВУК
Звук в играх делится на двухмерный и трехмерный. С первым вы уже знакомы, это стандартный звук, воспроизводимый обычным образом. Выражение «2D-звук» в большинстве случаев означает
«не 3D-звук».
3D-звук характерен для трехмерного моделирования, и, возможно, вы с ним еще не сталкивались — это звук, исходящий из конкретных мест сцены. На его громкость и тон влияет положение слушателя. Например, звуковой эффект, включенный с большого расстояния, будет слышен крайне слабо.
ВUnity поддерживаются оба вида звуков, и вы сами выбираете вид звука для каждого источника. Звук для таких вещей, как музыка, должен быть двухмерным, в то время как трехмерный звук в большинстве звуковых эффектов создает ощущение присутствия в сцене.
Вкачестве аналогии представьте магнитолу, проигрывающую компакт-диск в комна-
те. Зашедший в комнату человек четко услышит звук. Уходя из комнаты, он начнет

10.2. Воспроизведение звуковых эффектов 247
слышать его все тише, и в конце концов звук вообще исчезнет. При перемещении магнитолы по комнате вы будете слышать, как меняется громкость звука. Эту аналогию иллюстрирует рис. 10.2. Компакт-диск — это аналог компонента AudioClip, магнитола — компонента AudioSource, а человек — компонента AudioListener.
AudioListener
AudioClip |
AudioSource |
Рис. 10.2. Схема компонентов, управляющих аудиосистемой в Unity
Первым компонентом является аудиоклип. Он связан с реальным звуковым файлом, который мы импортировали в предыдущем разделе. Эти необработанные данные о форме сигнала являются основой всего, что делает аудиосистема, но сам по себе аудиоклип не выполняет никаких действий.
Следующий вид объекта — это источник звука. Именно он воспроизводит аудиоклипы. Это абстракция того, что на самом деле делает аудиосистема, но именно она делает более понятной концепцию трехмерного звука. 3D-звук, воспроизводимый конкретным источником, расположен в той же самой точке, что и этот источник; и хотя 2D-звуки также воспроизводятся источником, их местоположение не имеет значения.
Третьим видом объекта в составе аудиосистемы в Unity является слушатель звука. Как понятно из его названия, это объект, который слышит звуки, проецируемые из источников. Это еще одна абстракция реальных операций аудиосистемы (ведь очевидно, что реальным слушателем является играющий в игру человек!), но аналогично тому, как положение источника звука определяет координаты места, из которого исходит звук, положение слушателя звука определяет координаты места, в котором слышен звук.
УСОВЕРШЕНСТВОВАННАЯ СИСТЕМА УПРАВЛЕНИЯ ЗВУКОМ
В Unity 5 появилась функция Audio Mixers (аудиомикшеры). Аудиомикшеры позволяют обрабатывать аудиосигналы и накладывать на клипы различные эффекты. Более подробно сэтой функцией мож-
но познакомиться вдокументации к Unity: http://docs.unity3d.com/ru/current/Manual/AudioMixer.html.
Такие компоненты, как AudioClip и AudioSource, нужно назначать, а вот компонентом AudioListener оснащена камера, которая по умолчанию появляется в каждой новой сцене. Как правило, вам нужно, чтобы 3D-звуки реагировали на положение наблюдателя.

248 Глава 10. Звуковые эффекты и музыка
10.2.2. Присваивание зацикленного звука
Итак, давайте настроим наш первый звук в Unity! Аудиоклипы уже импортированы, у используемой по умолчанию камеры есть компонент AudioListener, так что нам остается назначить только компонент AudioSource. Добавим треск огня к шаблону Enemy — это персонаж, который хаотично перемещается по сцене.
ПРИМЕЧАНИЕ Так как враг будет звучать так, как будто он охвачен пламенем, можно связать с ним систему частиц, чтобы придать ему соответствующий звуку вид. Можно скопировать систему частиц, созданную в главе 4, превратив объект Particle в шаблон экземпляра, а затем выбрав в меню Asset команду Export Package. В качестве альтернативы можно повторить процедуру из главы 4, создав новый объект с нуля (перетащите шаблон Enemy в сцену для редактирования, а затем выберите в меню GameObject команду Apply Changes To Prefab).
Обычно для редактирования шаблона экземпляра его нужно перетащить в сцену, но в данном случае эту процедуру можно выполнить напрямую сразу же после добавления компонента к объекту. Выделите шаблон Enemy, чтобы его свойства появились на панели Inspector. Затем добавьте новый компонент, выбрав вариант Audio Audio Source. На панели Inspector появится компонент AudioSource.
Укажите источнику аудиоклип, который нужно воспроизвести. Перетащите файл со звуком со вкладки Project на ячейку Audio Clip панели Inspector; для этого примера мы используем звуковой эффект fireplace (рис. 10.3).
А ,
П Spatial Blend
а•а • а
2D 3D
Д ‚
а ‚ а•а а ƒ?
Н ‚ аƒ
?
Рис. 10.3. Настройки компонента AudioSource
Установите флажки Play On Awake и Loop (обязательно убедитесь, что флажок Mute сброшен). Флажок Play On Awake заставляет источник звука начать воспроизведение сразу же после загрузки сцены (в следующем разделе вы узнаете, как активировать звуки вручную во время игры). Флажок Loop заставляет источник звука играть непрерывно, повторяя клип снова и снова.
Мы хотим, чтобы этот источник аудио испускал 3D-звуки. Как уже объяснялось, 3D-звук имеет в сцене определенное положение. Это свойство источника звука регулируется ползунком Spatial Blend. Именно он отвечает за превращение звука из двухмерного в трехмерный; установите его в крайнее правое положение.

10.2. Воспроизведение звуковых эффектов 249
Теперь проверьте, включен ли звук у вас в колонках, и запустите игру. Вы услышите исходящее от врага потрескивание, которое ослабевает по мере его удаления от персонажа, так как в сцене используется источник 3D-звука.
10.2.3. Активация звуковых эффектов из кода
Настройка компонента AudioSource на автоматическое воспроизведение хорошо подходит для циклических звуков, но в большинстве случаев нужно, чтобы звуковые эффекты возникали в ответ на команды кода. Для этого нам все равно потребуется компонент AudioSource, но теперь звук будет воспроизводиться не непрерывно, а по команде.
Добавьте компонент AudioSource к объекту player (а не к камере). Связывать с компонентом конкретный аудиоклип на этот раз нет нужды, так как он определяется в коде. Сбросьте флажок Play On Awake, ведь звук будет возникать в ответ на команду. Ползунок Spatial Blend установите в положение 3D, так как эффект привязан к положению в сцене.
Затем добавьте код из следующего листинга в сценарий RayShooter, отвечающий за стрельбу.
Листинг 10.1. Звуковые эффекты, добавленные в сценарий RayShooter
...
[SerializeField] private AudioSource soundSource; │
[SerializeField] private AudioClip hitWallSound; │ [SerializeField] private AudioClip hitEnemySound; │
...
if (target != null) { ¬ Если переменная target не равна null, значит, игрок выстрелил во врага, поэтому… target.ReactToHit();
soundSource.PlayOneShot(hitEnemySound); ¬ } else {
StartCoroutine(SphereIndicator(hit.point)); soundSource.PlayOneShot(hitWallSound); ¬ ...метод PlayOneShot() для воспроизведения
звука Hit A Wall, если игрок промазал.
В новом варианте кода в верхней части сценария появилось несколько сериализованных переменных. Выделите камеру и перетащите объект player (обладающий компонентом AudioSource) на ячейку soundSource панели Inspector. Затем перетащите на ячейки Hit Wall Sound и Hit Enemy Sound аудиоклипы, которые будут воспроизводиться в каждом случае (swish при попадании в стену и ding при поражении врага).
Остальные две добавленные строки представляют собой методы PlayOneShot(). Именно они заставляют источник звука воспроизвести указанный клип. Методы добавляются в условную инструкцию для переменной target и воспроизводят разные звуки при попадании в разные цели.
ПРИМЕЧАНИЕ Можно было задать клип в компоненте AudioSource и вызвать для его воспроизведения метод Play(). Но несколько звуков будут обрывать друг друга, поэтому мы воспользовались методом PlayOneShot(). Чтобы понять суть проблемы, замените метод PlayOneShot() вот таким кодом и сделайте несколько быстрых выстрелов:
soundSource.clip=hitEnemySound; soundSource.Play();