- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
300 Глава 12. Развертывание игр на устройствах игроков
С а , |
|
Unity |
С а„ • а … |
а а . |
|
В а •, |
( • ‡а |
• • |
„ а 11) |
Щ а • • |
О а а а |
|
, ‡ |
||
а |
||
„ |
||
• а • а |
||
|
||
ВНИМАНИЕ: |
С |
|
•„ • а |
||
•‹ • а |
||
а „ |
||
|
Рис. 12.1. Окно Build Settings
местоположения файла начинается процесс построения, после чего Unity создает исполняемый файл для активной в данный момент платформы; давайте рассмотрим этот процесс для наиболее популярных платформ: настольных компьютеров, Интернета и мобильных устройств.
12.1. Создание приложений для настольных компьютеров: Windows, Mac и Linux
Если вы только приступаете к знакомству с вопросом создания игр в Unity, проще всего начать с развертывания игры на настольных компьютерах под управлением Windows PC, Mac OS X или Linux. Unity работает на настольных компьютерах, соответственно, приложение будет генерироваться для той машины, которой вы уже пользуетесь.
ПРИМЕЧАНИЕ Для упражнений этой главы можно открыть любой проект по вашему вкусу. Я уверяю, что все будет работать; более того, рекомендую для каждого следующего раздела открывать новый проект, чтобы убедиться в способности Unity развертывать любой проект на любой платформе!
12.1.1. Построение приложения
Первым делом выберите в меню File команду Build Settings, чтобы открыть одноименное окно. По умолчанию выбран вариант PC, Mac, and Linux, но если вас интересует другой вариант, укажите его в списке и щелкните на кнопке Switch Platform.
С правой стороны находится раскрывающийся список Target Platform. Он позволяет выбрать между платформами Windows PC, Mac OS X и Linux. В списке слева эти варианты рассматривались как один, но на самом деле это разные платформы, поэтому выберите нужную.
12.1. Создание приложений для настольных компьютеров: Windows, Mac и Linux 301
После этого остается щелкнуть на кнопке Build. Откроется окно диалога, в котором нужно будет выбрать местоположение будущего приложения. По умолчанию его предлагается сохранить в Unity-проекте, что не является лучшим вариантом для сборок, поэтому имеет смысл указать более безопасное место. После этого начнется процесс построения, для крупных проектов занимающий изрядное время, но для наших крохотных демонстрационных проектов он должен завершиться достаточно быстро.
СОБСТВЕННЫЙ СЦЕНАРИЙ ПОСТ-СБОРКИ
Базовый процесс построения превосходно подходит для большинства ситуаций, но некоторые предпочитают при построении каждой игры совершать дополнительные действия (например, перемещать справочные файлы в папку, в которой находится приложение). Такие задачи можно легко автоматизировать, поместив их всценарий, запускаемый после завершения процесса сборки.
Первым делом создайте новую папку на вкладке Project и присвойте ей имя Editor; именно здесь должны находиться все сценарии, влияющие на редактор Unity (это касается и процесса сборки). Создайте в этой папке сценарий с именем TestPostBuild и введите в него следующий код:
using UnityEngine; using UnityEditor;
using UnityEditor.Callbacks;
public static class TestPostBuild {
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
Debug.Log("build location: " + pathToBuiltProject);
}
}
Директива [PostProcessBuild] заставляет сценарий запускать расположенную непосредственно за ней функцию. Эта функция получит местоположение построенного приложения; после этого вы сможете использовать данный параметр в различных командах для работы с файловой системой из языка C#. В настоящее время путь кфайлу выводится на консоль, что позволяет удостовериться в работоспособности сценария.
Приложение появится в указанной вами папке; запустите его двойным щелчком, как любую другую программу. Мои поздравления! Как видите, это было несложно. Процесс построения приложений совершенно тривиален, но допускает различные варианты настройки; посмотрим, как мы можем его доработать.
12.1.2. Настройки проигрывателя: имя и значок приложения
Вернемся в окно Build Settings, но на этот раз щелкнем не на кнопке Build, а на кнопке Player Settings. На панели Inspector появится список настроек, показанный на рис. 12.2; они контролируют различные аспекты готового приложения.
Так как настроек в данном случае много, лучше почитать о них в руководстве пользователя — вот адрес страницы: http://docs.unity3d.com/ru/current/Manual/class-PlayerSettings. html.
Смысл трех верхних параметров очевиден: Company Name (имя компании), Product Name (имя продукта) и Default Icon (значок, предлагаемый по умолчанию). Укажите
302 Глава 12. Развертывание игр на устройствах игроков
значение первых двух. В поле Company Name — название студии-разработчика, а в поле Product Name — название игры. Затем задайте значок игры, перетащив нужное изображение с вкладки Project (при необходимости сначала импортируйте его в проект); когда приложение будет построено, это изображение появится как его значок.
|
Ч а а а |
|
а а , |
|
а• а |
|
а Project |
И а а-а а а а |
|
. О , -, |
В а а |
, -, |
|
а •а• |
а |
• |
а а … ! |
|
Н • а ; |
|
а а• |
|
а • а‰ Unity |
Рис. 12.2. Настройки проигрывателя на панели Inspector
НАСТРОЙКИ КАЧЕСТВА
На генерируемое приложение также влияют настройки проекта, доступ ккоторым осуществляется через меню Edit. Вчастности, именно тут настраивается визуальное качество готового приложения. Выберите в меню Edit команду Project Settings, а затем в дополнительном меню — команду Quality.
На панели Inspector появятся элементы управления качеством, наиболее важными из которых являются флажки в расположенной сверху группе. В верхнем ряду находятся значки возможных платформ, а сбоку указаны варианты настроек качества. Установленные флажки показывают доступные для данной платформы настройки, а выделенные зеленым — текущие настройки. В большинстве случаев по умолчанию применяется вариант Fastest (соответствующий минимальному качеству), но если все выглядит плохо, можно выбрать вариант Fantastic; щелчок на стрелке в нижнем ряду под нужным значком платформы открывает меню.
В • а• а• а• а - а а а а• а
Щ а
Default,
а а а. В •
• • а а
Сетка настроек качества на панели Inspector
12.1. Создание приложений для настольных компьютеров: Windows, Mac и Linux 303
Одновременное наличие в интерфейсе флажков и меню Default может показаться избыточным, но на самом деле это не так. Разные платформы зачастую обладают разными функциональными возможностями графических средств, поэтому Unity позволяет индивидуально задавать уровни качества для целевых платформ (например, самое высокое качество для настольных компьютеров и минимальное качество для мобильных устройств).
Значок и имя приложения придают результатам вашего труда ощущение законченности. Другим вариантом настройки поведения приложений является зависящий от платформы код.
12.1.3. Компиляция в зависимости от платформы
По умолчанию весь написанный вами код запускается на всех платформах одним и тем же способом. Но Unity предоставляет нам ряд директив компилятора (известных как определения платформ), которые заставляют код работать исключительно на указанной платформе. Полный список определений платформ вы найдете на странице http://docs.unity3d.com/ru/current/Manual/PlatformDependentCompilation.html.
Директивы существуют для всех поддерживаемых Unity платформ, соответственно, на каждой из них вы можете запускать свою версию кода. Обычно большую часть кода помещать внутрь директив не требуется, но отдельные фрагменты иногда имеет смысл запускать с привязкой к конкретной платформе. Некоторые варианты сборки существуют исключительно на одной платформе (например, в главе 11 упоминалось, что доступ к файловой системе в веб-проигрывателях отсутствует), поэтому требуются директивы компилятора, позволяющие обойти это ограничение. Следующий листинг демонстрирует пример написания такого кода.
Листинг 12.1. Сценарий PlatformTest с примером кода, привязанного к платформе
using UnityEngine;
using System.Collections;
public class PlatformTest : MonoBehaviour { void OnGUI() {
#if UNITY_EDITOR ¬ Этот раздел запускается только в редакторе.
GUI.Label(new Rect(10, 10, 200, 20), "Running in Editor");
#elif UNITY_STANDALONE ¬ Только в приложениях для рабочего стола/автономных приложениях.
GUI.Label(new Rect(10, 10, 200, 20), "Running on Desktop"); #else
GUI.Label(new Rect(10, 10, 200, 20), "Running on other platform"); #endif
}
}
Создайте сценарий PlatformTest и скопируйте в него код этого листинга. Свяжите его с произвольным объектом сцены (для тестирования подойдет любой объект), и в верхней левой части экрана появится маленькое сообщение. При воспроизведении игры в редакторе Unity это будет сообщение Running in the Editor (выполняется в редакторе), но если вы сгенерируете приложение и запустите его, появится уже другой текст: Running on Desktop (выполняется на настольном компьютере). В каждом случае запускается свой вариант кода!