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

9.1. Создание натурной сцены 217
создаваемых вами игр (например, генерировать врагов можно на базе ответов сервера).
Поэтому приступим к работе!
9.1. Создание натурной сцены
Так как мы собираемся скачать информацию о погоде, первым делом следует настроить сцену, в которой мы сможем наблюдать за погодными условиями. Сложнее всего создать небо, поэтому для начала мы займемся назначением текстуры камня геометрии игрового уровня.
Как и в главе 4, я скачал пару изображений с сайта www.textures.com, чтобы назначить их стенам и полу уровня. Напоминаю, что скачанные изображения нужно отредактировать таким образом, чтобы их размер выражался степенями двойки, например 256 × 256. Затем импортируйте их в проект Unity, создайте материалы и назначьте им изображения (то есть перетащите каждое из них на соответствующую ячейку в редакторе параметров материала). Перетащите материалы на стены и пол в сцене и увеличьте параметр Tiling (попробуйте значение 8 или 9 в одном или в обоих направлениях), чтобы изображение перестало ужасным образом растягиваться по всей поверхности.
Теперь пришло время заняться небом.
9.1.1. Генерирование неба с помощью скайбокса
Начните с импорта изображений для скайбокса, как вы делали в главе 4: скачать подходящие изображения можно с сайта www.93i.de. На этот раз выберем в дополнение к набору TropicalSunnyDay набор DarkStormy (в этом проекте мы создадим более сложный вариант неба). Перетащите эти текстуры на вкладку Project и (как объяснялось в главе 4) выберите в раскрывающемся списке Wrap Mode вариант Clamp.
Теперь создайте материал, который будет использоваться скайбоксом. В верхней части настроек откройте меню Shader, чтобы увидеть список доступных вариантов раскраски. Наведите указатель мыши на раздел Skybox и выберите в дополнительном меню вариант 6-Sided. После этого у материала появятся шесть ячеек для текстур (вместо одной ячейки Albedo, характерной для стандартной раскраски).
Перетащите изображения типа SunnyDay на ячейки для текстур нового материала. Окончания имен текстур соответствуют именам ячеек, на которые их нужно поместить (top, front и т. д.). После этого новый материал можно использовать в качестве скайбокса для сцены.
Перетащите новый материал на поле Skybox в окне Lighting (чтобы его открыть, выберите в меню Window команду Lighting). Щелкните на кнопке Play, и вы увидите нечто напоминающее рис. 9.1.
Замечательно, теперь у нас есть природная сцена! Скайбокс позволяет легко имитировать окружающую среду, в которой оказывается игрок. Однако встроенная в Unity раскраска для скайбокса имеет один серьезный недостаток — изображения нельзя менять, что дает нам совершенно статичное небо. Для решения этой проблемы мы создадим свой вариант раскраски.

218 Глава 9. Подключение игры к Интернету
Рис. 9.1. Сцена с фоновыми изображениями неба
9.1.2. Настройка управляемой кодом атмосферы
Изображения из набора TropicalSunnyDay дают нам великолепную иллюзию солнечного дня, но как быть, если мы хотим сымитировать переход от солнечной погоды к облачности? Нам потребуется второй набор снимков (демонстрирующих облачное небо), а значит, и новая раскраска для скайбокса.
Как объяснялось в главе 4, раскраска реализуется короткой программой, указывающей, каким образом должно визуализироваться изображение. Это означает, что вы можете программировать новые варианты раскрасок, что нам в данном случае и требуется. Мы создадим новую раскраску, в которой используется два варианта изображений для скайбокса и переход между ними. Впрочем, нужный нам вариант уже существует в коллекции сценариев Unify-сообщества по адресу http://wiki.unity3d.com/ index.php?title=SkyboxBlended.
В редакторе Unity создайте новый сценарий раскраски. Для этого вызовите меню с командой Create, как при создании новых сценариев на языке C#, но на этот раз выберите в нем вариант Shader. Присвойте новому ресурсу имя SkyboxBlended и дважды щелкните на нем, чтобы получить доступ к редактированию сценария. Скопируйте код с вики-страницы и вставьте его в наш сценарий. Команда Shader "Skybox/ Blended" в верхней строке заставляет Unity добавить новую раскраску в категорию Skybox (в которой находится и обычный скайбокс).
ПРИМЕЧАНИЕ Мы не будем углубляться в детали программирования раскрасок. Это достаточно сложная тема, выходящая за рамки темы данной книги. Если вы захотите самостоятельно ее изучить, начать можно отсюда: http://docs.unity3d.com/Manual/ShadersOverview.html.
Теперь для нашего материала можно выбрать раскраску Skybox Blended. Появятся 12 полей текстуры, два набора по шесть изображений. Первым шести полям, как и раньше, следует назначить изображения из набора TropicalSunnyDay, а для остальных текстур используйте набор DarkStormy.
В верхней части настроек новой раскраски находится ползунок Blend. Он контролирует отображаемую долю изображений; когда вы перетаскиваете его из крайнего левого положения в крайнее правое, скайбокс переходит от солнечной к облачной погоде. Для тестирования меняйте положение ползунка и запускайте воспроизведение.

9.1. Создание натурной сцены 219
Разумеется, во время игры никто так делать не будет, поэтому давайте напишем код, меняющий вид неба.
Создайте пустой объект и присвойте ему имя Controller. Создайте сценарий и присвойте ему имя WeatherController. Перетащите сценарий на пустой объект и введите в него код следующего листинга.
Листинг 9.1. Сценарий перехода от солнечной погоды к облачности
using UnityEngine;
using System.Collections;
public class WeatherController : MonoBehaviour { [SerializeField] private Material sky; ¬ [SerializeField] private Light sun;
private float _fullIntensity;
private float _cloudValue = 0f;
void Start() {
_fullIntensity = sun.intensity; ¬ Исходная интенсивность света считается «полной».
}
void Update() { SetOvercast(_cloudValue);
_cloudValue += .005f; ¬ Для непрерывности перехода увеличивайте значение в каждом кадре.
}
private void SetOvercast(float value) { ¬ sky.SetFloat("_Blend", value);
sun.intensity = _fullIntensity - (_fullIntensity * value);
}
}
Я обратил внимание на несколько аспектов данного кода, но его центром является находящийся почти в конце метод SetFloat(). До этого момента все уже более-менее знакомо, а с этим методом вы пока не сталкивались. Он задает для материала числовое значение, которое указывается в качестве его первого параметра. В рассматриваемом случае материал обладает свойством Blend (обратите внимание, что свойства материала в коде начинаются с нижнего подчеркивания).
В остальной части кода мы определили несколько переменных, в том числе для материала и света. В случае материала нам потребовалась ссылка на только что созданный нами составной материал для скайбокса, а как обстоят дела с освещением? Дело в том, что при переходе от солнечной к облачной погоде сцена становится темнее; при увеличении параметра Blend мы уменьшаем интенсивность освещения. В качестве основного осветителя сцены выступает направленный источник света; выделите его для доступа к параметрам на панели Inspector.
ПРИМЕЧАНИЕ Усовершенствованная система освещения в Unity (которая называется Enlighten) задействует скайбокс для достижения реалистичных результатов. Но этот подход некорректно работает в случае меняющегося скайбокса, поэтому имеет смысл отключить эту систему. В нижней части окна диалога Lighting можно сбросить флажок Continuous Baking для визуализатора; после