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

42 Глава 2. Создание 3D-ролика
Л а а |
|
|
|
|
Y |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
П а а а |
|
|
а |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
а |
|
|
|
|
|
|
|
|
Z |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X
Улевой и правой руки ось Z ориентирована в разных направлениях
ВUnity, как и во многих других приложениях для работы с компьютерной графикой, используется левая система координат. Однако существует множество инструментов, в которых применяется правая система координат (например, OpenGL). Помните об этом, чтобы не растеряться, столк нувшись с другими направлениями координатных осей.
Теперь, когда у вас есть не только план действий, но и представление о том, как с помощью координат задать положение объекта в трехмерном пространстве, приступим к работе над сценой.
2.2. Начало проекта: размещение объектов
Итак, начнем с создания объектов и размещения их в сцене. Первыми будут статические объекты — пол и стены. Затем выберем место для источников света и камеры. Последним создадим игрока — это будет объект, к которому вы добавите сценарии, перемещающие его по сцене. Рисунок 2.5 демонстрирует вид редактора после завершения работы.
На а
а
Ка а а а а
а;
а
а а
а
И , а •
а • •-а а
Рис. 2.5. Сцена в редакторе с полом, стенами, источниками света, камерой и игроком

2.2. Начало проекта: размещение объектов 43
В главе 1 демонстрировался способ создания нового проекта в Unity. Именно это мы сейчас и проделаем. Напоминаю, что нужно выбрать в меню File команду New Project и в появившемся окне указать имя проекта. После этого сразу же сохраните пустую сцену, так как изначально файл сцены у нового проекта отсутствует. Начнем мы с создания наиболее очевидных объектов.
2.2.1. Декорации: пол, внешние и внутренние стены
В расположенном в верхней части экрана меню GameObject наведите указатель мыши на строчку 3D Object, чтобы открыть дополнительное меню. Выберите в нем вариант Cube, так как для нашей сцены требуется куб (позднее вы поработаете и с другими фигурами, такими как Sphere и Capsule). Отредактируйте положение и масштаб появившегося в сцене куба, а также его имя таким образом, чтобы получить пол; значения, которые следует присвоить параметрам этого объекта на панели Inspector, показаны на рис. 2.6 (для превращения куба в пол его нужно растянуть).
2. П а а
, а .
В а а
а
•
П • • • а а
а• ,
а • а
1. В • а.
На , ,
-а€ , «Floor»
Э а а
Cube, а а • а
а .
В • • а а
: Mesh Filter (€ •
а), Mesh Renderer (€ а а
а) Box Collider (€ а
а •
-)
Рис. 2.6. Панель Inspector для пола
ПРИМЕЧАНИЕ Единицы измерения положения могут выбираться произвольным образом, главное, чтобы они использовались для всех элементов сцены. Чаще всего в качестве единицы измерения фигурирует метр. Сам я предпочитаю пользоваться именно метрами, но бывают случаи, когда я выбираю футы. Хотя мне доводилось видеть людей, которые считали, что размеры в сцене измеряются в дюймах!
Повторите описанную последовательность для создания внешних стен комнаты. Можно каждый раз задействовать новый куб, а можно копировать и вставлять существующий объект, указывая стандартные сокращения. Двигайте, поворачивайте

44 Глава 2. Создание 3D-ролика
и масштабируйте стены, чтобы получить показанный на рис. 2.5 периметр. Экспериментируйте с различными значениями (например, 1, 4, 50 для полей Scale) или воспользуйтесь инструментами преобразований, с которыми вы познакомились в разделе 1.2.2 (напоминаю, что перемещения и повороты в трехмерном пространстве называют преобразованиями).
СОВЕТ Не забудьте про средства навигации, позволяющие рассматривать сцену под разными углами и менять ее масштаб, например имитируя взгляд с высоты птичьего полета. При этом нажатие клавиши F вернет вас к просмотру выделенного в данный момент объекта.
Точные значения преобразований для стен будут зависеть от того, каким образом вы повернете и отмасштабируете исходные объекты Cube, подогнав их размеры и положение, а также от способа их связывания на вкладке Hierarchy. К примеру, на рис. 2.7 демонстрируется ситуация, когда все стены являются потомками пустого корневого объекта. Содержимое вкладки Hierarchy в этом случае имеет упорядоченный вид. Если вы предпочитаете просто скопировать рабочие значения, скачайте пример проекта
и возьмите все данные оттуда.
Рис. 2.7. Панель Hierarchy,
показывающая, что стены и пол являются потомками пустого объекта
СОВЕТ Связи между объектами устанавливаются простым перетаскиванием объектов друг на друга на вкладке Hierarchy. Объект, к которому присоединены другие объекты, называется предком (parent); объекты, присоединенные к другим объектам, называются потомками (children). Перемещение (поворот или масштабирование) родительского объекта сопровождается аналогичным преобразованием всех его потомков.
СОВЕТ Для систематизации объектов сцены подобным образом применяются пустые игровые объекты. Связывание видимых объектов с корневым позволяет сворачивать списки объектов на вкладке Hierarchy. Но помните, что перед этой операцией следует расположить пустой корневой объект в точке с координатами 0, 0, 0, чтобы в дальнейшем избежать проблем с позиционированием.
ЧТО ТАКОЕ GAMEOBJECT?
Все объекты сцены представляют собой экземпляры класса GameObject аналогично тому, как все компоненты сценариев наследуют от класса MonoBehaviour. Этот факт становится более наглядным, если пустому объекту присвоить имя GameObject. Впрочем, даже если этот объект будет называться Floor, Camera или Player, суть дела не изменится.
На самом деле GameObject представляет собой всего лишь контейнер для набора компонентов. Его основным назначением является обеспечение некоего объекта, к которому можно присоединять класс MonoBehaviour. Как все это будет выглядеть в сцене, зависит от добавленных к объекту GameObject компонентов. К примеру, куб получается добавлением компонента Cube, сфера — добавлением компонента Sphere, и т. п.
Завершив работу над внешними стенами, приступайте к созданию внутренних. Расположите их по своему вкусу. Вам нужны коридоры и препятствия, среди которых будет происходить движение.

2.2. Начало проекта: размещение объектов 45
В итоге в сцене появится комната, но без источников света игрок ничего в ней не увидит. Поэтому давайте осветим нашу комнату.
2.2.2. Источники света и камеры
Как правило, трехмерные сцены освещаются направленным источником света, к которому добавляется набор точечных осветителей. Начать имеет смысл с направленного источника. Он может по умолчанию присутствовать в сцене, но если его нет, наведите указатель мыши на строку Light в меню GameObject и в открывшемся дополнительном меню выберите вариант Directional Light.
ТИПЫ ОСВЕТИТЕЛЕЙ
Существуют различные типы осветителей, разными способами проецирующие световые лучи. Три основных типа: точечный источник, прожектор и направленный источник.
Все лучи точечного источника (point light) начинаются в одной точке и распространяются во всех направлениях. В реальном мире таким осветителем является лампочка. Яркость света увеличивается по мере приближения к источнику за счет концентрации лучей.
Лучи прожектора (spot light) также исходят из одной точки, но распространяются в пределах ограниченного конуса. В текущем проекте мы с прожекторами работать не будем, но осветители данного типа повсеместно используются для подсвечивания отдельных частей уровня.
Лучи направленного источника света (directional light) распространяются равномерно и параллельно друг другу, одинаково освещая все элементы сцены. Это аналог солнца.
Испускаемый направленным осветителем свет не зависит от местоположения источника, значение имеет только его ориентация, поэтому его можно поместить в произвольную точку сцены. Я рекомендую установить его над комнатой, чтобы он выглядел как солнце и не мешал вам при работе с остальными фрагментами сцены. Поверните источник света и посмотрите, как это повлияет на освещенность комнаты; для получения нужного эффекта я рекомендую слегка повернуть его относительно осей X и Y. На панели Inspector вы найдете параметр Intensity (рис. 2.8). Как следует из его названия, он управляет яркостью света. Если бы данный направленный осветитель был в сцене единственным, его яркость имело бы смысл увеличить, но, так как мы добавим несколько точечных источников света, его можно оставить тусклым. Например, присвойте параметру Intensity значение 0.6.
О а а а а |
З а• а |
. К а, |
|
а а а |
, |
а а ( |
• а 0 • а а |
а а |
• |
• • • • а «Б ») |
|
Рис. 2.8. Настройки направленного источника света на панели Inspector
Теперь командой уже знакомого вам меню создайте несколько точечных осветителей, поместив их в темные места комнаты. Вам нужно, чтобы все было как следует освещено. Источников должно быть не слишком много (иначе пострадает