- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
304 Глава 12. Развертывание игр на устройствах игроков
Для тестирования мы воспользовались определением платформы, воспринимающим все платформы на базе настольных компьютеров как одну, но, как можно прочитать
вдокументации, существуют отдельные определения платформ для Windows, Mac и Linux. Более того, отдельные определения существуют для всех поддерживаемых
вUnity платформ, и для каждой из них вы можете создать свой вариант кода. На этом мы перейдем к рассмотрению следующей важной платформы: Интернета.
12.2. Создание игр для Интернета
Хотя настольные компьютеры являются основной целевой платформой для создаваемых с помощью Unity игр, существуют и другие важные варианты развертывания, например развертывание в Интернете. Оно требуется играм, которые запускаются в веб-браузерх и, соответственно, доступны для игроков в Интернете.
12.2.1. Проигрыватель Unity и HTML5/WebGL
Раньше создаваемые в Unity варианты программ для Интернета воспроизводились с помощью специальных подключаемых модулей браузера. Это было связано с отсутствием встроенных в браузер средств отображения трехмерной графики. Но в последние годы начал развиваться стандарт WebGL. С технической точки зрения он отличается от HTML5, но эти термины связаны друг с другом и часто используются как синонимы.
В Unity 5 в список платформ в окне Build Settings был добавлен вариант WebGL, а в следующих версиях он может превратиться в основной вариант создания приложений для Интернета. Именно это направление развития было выбрано в компании. Оно обусловлено в числе прочего давлением со стороны производителей браузеров, которые в реализации интерактивных веб-приложений, в том числе игр, предпочитают отходить от дополнительных подключаемых модулей в пользу HTML5/WebGL.
Впрочем, независимо от формы итогового приложения, процесс его генерации для веб-проигрывателя и для WebGL практически идентичен. В следующих разделах вы найдете описание процедуры для веб-проигрывателя с упоминаниями, чем именно отличается код, предназначенный для WebGL.
12.2.2. Создание файла Unity и тестовой веб-страницы
Откройте какой-нибудь другой проект (чтобы убедиться, что работать можно с любым проектом) и вызовите окно Build Settings. Выделите строку Web Player и щелкните на кнопке Build. Появится окно выбора файла; введите для данного приложения имя WebTest и при необходимости выберите для него более безопасное место (вне проекта Unity).
На этот раз у вас появятся два файла: сама игра Unity с расширением .unity3d и пустая веб-страница для воспроизведения игры. Откройте эту страницу, и в центре вы увидите встроенную игру.
Никакими особыми характеристиками страница не обладает; это всего лишь пример для тестирования игры. На ней можно настроить код и даже предоставить собственную версию веб-страницы (поверх которой скопирован код Unity). Одним из
12.2. Создание игр для Интернета 305
наиболее важных вариантов адаптации является добавление возможности взаимодействия Unity с браузером. Давайте посмотрим, каким образом это делается.
12.2.3. Обмен данными с JavaScript в браузере
Созданная в Unity онлайновая игра может обмениваться данными с браузером (точнее, с запущенным в браузере сценарием JavaScript), причем обмен может идти в обоих направлениях — как от Unity к браузеру, так и от браузера к Unity. В первом случае все тривиально: в Unity есть пара специальных команд, напрямую запускающих код в браузере.
В обратной ситуации все несколько сложнее: код JavaScript в браузере идентифицирует объект по имени, после чего Unity передает этому именованному объекту сцены сообщение. То есть в сцене должен присутствовать объект, который будет получать данные от браузера.
Чтобы посмотреть, как все это выглядит на практике, создайте новый сценарий с именем WebTestObject. Кроме того, создайте в активной сцене пустой объект с именем Listener (ему следует присвоить именно это имя, потому что оно фигурирует в коде). Свяжите с этим объектом новый сценарий и скопируйте в него код из следующего листинга.
Листинг 12.2. Сценарий WebTestObject для тестирования механизма обмена данными с браузером
using UnityEngine;
using System.Collections;
public class WebTestObject : MonoBehaviour { private string _message;
void Start() {
_message = "No message yet"; ¬ Исходное значение для сообщения.
}
void Update() {
if (Input.GetMouseButtonDown(0)) { ¬ Щелчок мыши вызывает функцию в браузере.
Application.ExternalCall("ShowAlert", "Hello out there!");
}
} |
|
void OnGUI() { |
Отображаем сообщение в верхнем |
GUI.Label(new Rect(10, 10, 200, 20), _message); ¬ |
|
} |
левом углу экрана. |
|
public void RespondToBrowser(string message) { ¬ Функция, вызываемая браузером. _message = message;
}
}
Теперь еще раз сгенерируйте приложение для Интернета, чтобы добавить в игру новый код. После этого останется только отредактировать веб-страницу. Нужно вставить пару функций в JavaScript-код и кнопку в HTML-код. Добавьте JavaScript-код
306 Глава 12. Развертывание игр на устройствах игроков
и HTML-тег в следующий листинг; JavaScript-функции вставляются перед закрывающим тегом <script>, а кнопка — перед закрывающим тегом <body>.
Листинг 12.3. Фрагменты JavaScript- и HTML-кода, поддерживающие обмен данными между браузером и Unity
...
function ShowAlert(arg) { alert(arg); ¬ Выводим окно оповещения.
}
function SendToUnity() { ¬ SendMessage() вызывает функцию внутри Unity. u.getUnity().SendMessage("Listener", "RespondToBrowser", "Hello from the
browser!");
}
--> </script>
...
<input type="button" value="Send to Unity" onclick="SendToUnity();" /> #C ¬ </body>
</html>
Кнопка,
вызывающая
функцию
JavaScript.
Чтобы посмотреть, как работает этот код, откройте веб-страницу. При пересылке данных от Unity в браузер при щелчке в редакторе Unity сценарий WebTestObject вызывает функцию в браузере; сделайте несколько щелчков, и вы увидите, как в браузере появляется окно оповещения. Метод Application.ExternalCall() запускает именованную функцию JavaScript. Кроме того, в Unity есть метод Application. ExternalEval(), отвечающий за отправку сообщений браузеру; в нашей ситуации вместо вызова конкретной функции запускаются произвольно выбранные фрагменты JavaScript-кода. В большинстве случаев лучше вызывать функции (чтобы JavaScript- и Unity-фрагменты оставались независимыми друг от друга), но иногда имеет смысл запуск произвольно выбранных фрагментов, таких как вот этот код перезагрузки страницы:
Application.ExternalEval("location.reload();");
Код JavaScript на веб-странице также может посылать сообщения в Unity; достаточно щелкнуть на кнопке, которую мы добавили на страницу, и в Unity появится измененное сообщение. HTML-код кнопки ссылается на функцию JavaScript, которая, в свою очередь, вызывает метод SendMessage() в экземпляре Unity, вызывающий именованную функцию у именованного объекта в Unity; первый параметр представляет собой имя объекта, второй — имя метода, третий — строку, которая передается в метод. Листинг 12.3 вызывает метод RespondToBrowser() из сценария WebTestObject.
ПРИМЕЧАНИЕ WebGL-сборки также могут обмениваться данными с JavaScript-кодом вебстраниц. Код этого взаимодействия практически идентичен показанному. Точнее, в случае отправки сообщения из Unity он совпадает, а вот в обратном направлении — со страницы в Unity — метод SendMessage(), сохранив тот же самый набор параметров, более не требует префикса u.getUnity().
Итак, мы разобрались, как осуществляется взаимодействие с браузером в случае сборок для Интернета; осталось познакомиться с последней платформой (точнее, с набором платформ) — мобильными приложениями.