- •Предисловие
- •Введение
- •Благодарности
- •О книге
- •Перспективы
- •Условные обозначения, требования и доступные для скачивания данные
- •Автор в Интернете
- •Об авторе
- •Глава 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. Назначение материала
182 Глава 7. Игра от третьего лица: перемещение и анимация игрока
и в случае иерархических цепочек: корневым называется объект, с которым связаны все остальные объекты. Соответственно, корень анимации можно представить как основу персонажа, а все остальное двигается относительно этой основы. Для настройки этого объекта предоставляется несколько параметров, возможно, вы захотите поэкспериментировать, присваивая им различные значения в процессе работы над собственными вариантами анимации. Для наших же целей установите значения Body Orientation, Center Of Mass и Center Of Mass.
Щелчок на кнопке Apply добавит к персонажу анимационный клип idle. Выполните указанные операции еще два раза: клип walk должен начинаться в кадре 144 и заканчиваться в кадре 169, а клип run — начинаться в кадре 171 и заканчиваться в кадре 190. Все остальные параметры сделайте такими же, как у клипа idle, так как это тоже зацикленная анимация.
Четвертым станет анимационный клип jump, и его параметры будут несколько отличаться. Прежде всего, на этот раз нам нужен не цикл, а неподвижная поза, поэтому устанавливать флажок Loop Time не нужно. Введите в поля Start и End значения 190.5 и 191 соответственно; эта поза определена в одном кадре, но в Unity требуются различные значения параметров Start и End. Из-за введенных значений анимация в расположенном снизу окне предварительного просмотра будет выглядеть не совсем корректно, но на положении персонажа во время игры это не скажется.
Щелкните на кнопке Apply, чтобы подтвердить создание новых анимационных клипов, и переходите к следующему этапу — созданию контроллера анимации.
7.4.2. Создание контроллера для анимационных клипов
Теперь нам нужно создать контроллер-аниматор для персонажа. На этом этапе мы определяем состояния анимации и создаем между ними переходы. Во время каждого состояния воспроизводится свой набор клипов, а наши сценарии заставят контроллер переключаться между состояниями.
Может показаться странным, что мы пользуемся дополнительными средствами — помещаем между кодом и воспроизведением анимации абстракцию в виде контроллера. Скорее всего, раньше вы работали с системами, в которых анимация воспроизводилась непосредственно из кода; кстати, именно таким образом работала старая система Legacy, пользуясь вызовами вида Play("idle"). Но непрямой способ позволяет применять анимацию к разным моделям, не ограничиваясь воспроизведением анимации, непосредственно связанной с конкретной моделью. В этой главе мы не будем пользоваться данным преимуществом, поэтому просто запомните, что такая возможность существует. Получить готовую анимацию можно из разных источников, в том числе сотрудничая с аниматорами или покупая отдельные ролики в интернет-магазинах (например, в Asset Store для Unity).
Начните с создания нового контроллера-аниматора (в меню Assets выберите команду Create Animator Controller — не перепутайте с пунктом Animation, который создает ресурсы совсем другого типа). На вкладке Project появится значок, украшенный забавной сеткой линий (рис. 7.15); присвойте ему имя player. Выделите персонаж в сцене, и вы увидите, что у него появился новый компонент Animator; он есть у любой допускающей анимацию модели наряду с компонентом Transform и любыми другими
7.4. Анимация персонажа 183
добавленными вами компонентами. У этого компонента есть поле Controller, предназначенное для привязки контроллера-аниматора. Перетащите на это поле только что созданный контроллер player (обязательно сбросьте флажок Apply Root Motion).
К-а а |
С а Root Motion, |
( а а Project) |
а• • player ƒ |
|
„а … † ‡ |
|
а а‡ ˆ. В ‹Œ |
|
ƒ•а…Œ а † |
|
ƒ…, ˆ•а |
Рис. 7.15. Контроллер-аниматор и компонент Animator
Контроллер-аниматор представляет собой дерево связанных узлов (именно этим объясняется рисунок на значке данного ресурса), просмотр и управление которыми осуществляются на вкладке Animator. Эта вкладка, отображенная на рис. 7.16, показывает еще одно представление сцены, аналогично вкладкам Scene или Project, но по умолчанию она закрыта. Выберите в меню Window команду Animator (не перепутайте с окном Animation). На открывшейся вкладке вы увидите сеть узлов, принадлежащую выделенному в данный момент контроллеру (или контроллеру-аниматору выделенного персонажа).
З а а • • а ,
а • • а а . П • а а
†а • а
Ка а а а
а а . Ка
а а , а а
а а а.
(О а •
а а а а а • ,
а а а •.)
С • а а• « • а ». О • а а , а • A B
Рис. 7.16. Вид нашего контроллера-аниматора на вкладке Animator
СОВЕТ Напоминаю, что вы можете перемещать вкладки внутри редактора Unity, располагая их в нужных вам местах и формируя интерфейс по собственному вкусу. Мне нравится, когда вкладка Animator находится рядом с окнами Scene и Game.
Изначально мы видим только два существующих по умолчанию узла: Entry и Any State. Узлом Any State мы пользоваться не будем. Вместо этого создадим новые узлы, перетаскивая анимационные клипы. На вкладке Project щелкните на стрелке, расположенной
184 Глава 7. Игра от третьего лица: перемещение и анимация игрока
на значке модели персонажа, чтобы посмотреть содержимое этого ресурса. В числе прочего вы увидите и определенные вами анимационные клипы, как показано на рис. 7.17. Перетащите их на вкладку Animator. Клип walk пока не трогайте (он пригодится для других проектов), ограничьтесь клипами idle, run и jump.
Щ а ,
а
И а а
а а а
Рис. 7.17. Раскрытый ресурс на вкладке Project
Щелкните правой кнопкой мыши на узле Idle и выберите команду Set As Layer Default State. Узел станет оранжевым, в то время как все остальные останутся серыми; состояние анимации, предлагаемое по умолчанию, представляет собой место, в котором начинается сеть узлов, пока игра не внесет свои коррективы. Узлы нужно будет соединить друг с другом, обеспечивая переходы между состояниями анимации; щелкните на узле правой кнопкой мыши, выберите команду Make Transition и начните перетаскивать стрелку в направлении другого узла. Связь образуется щелчком на этом узле. Соедините узлы в соответствии с образцом на рис. 7.16 (в большинстве случаев вам требуется переход туда и обратно, исключением является переход от узла jump к узлу run). Эти линии переходов, определяющие связи состояний анимации друг с другом, во время игры будут контролировать переходы из одного состояния в другое.
ВНИМАНИЕ В процессе работы на вкладке Animator может появиться ошибка AnimationState Machine.TransitionEditionContext.BuildNames. Просто перезапустите Unity; это не представляющий опасности сбой.
Переходы обусловливаются набором управляющих значений, которые нам нужно создать. В верхнем левом углу рис. 7.16 видна вкладка Parameters; перейдите на нее, чтобы увидеть панель добавления параметров с кнопкой в виде значка + (плюс). Добавьте параметр типа float с именем Speed и параметр типа Boolean с именем Jumping. Наш код будет менять эти значения, причем они послужат триггерами переходов между состояниями анимации. Выделите линию перехода, чтобы увидеть ее параметры на панели Inspector, как показано на рис. 7.18.
Именно здесь мы указываем, каким образом должны меняться состояния анимации при изменении параметров. Например, выделите переход Idle-Run, чтобы отредактировать условия его возникновения. В свитке Conditions выберите вариант Speed, Greater и 0.1. Сбросьте флажок Has Exit Time (он заставляет клип воспроизводиться на протяжении всей игры, вместо того чтобы завершиться сразу же после перехода). Затем щелкните на стрелке рядом с названием раздела Settings, чтобы увидеть меню целиком; другие переходы должны быть в состоянии прерывать этот, поэтому выберите в раскрывающемся списке Interruption Source вариант Current State. Повторите эту операцию для всех переходов, перечисленных в табл. 7.1.
7.4. Анимация персонажа 185
|
Д а |
|
а |
|
, |
|
а |
Щ а , |
а а |
|
|
|
|
а а |
И а а , |
|
а |
|
а а |
|
Э а • |
|
• а |
|
( • |
|
а а• |
|
а Alt) |
|
У а |
|
а а |
|
а а а |
|
Рис. 7.18. Параметры перехода на панели Inspector |
Таблица 7.1. Условия всех переходов для данного контроллера анимации
Переход |
Условие |
Прерывание |
|
|
|
Idle-Run |
Speed больше чем 0.1 |
Current State |
|
|
|
Run-Idle |
Speed меньше чем 0.1 |
None |
|
|
|
Idle-Jump |
Jumping = true |
None |
|
|
|
Run-Jump |
Jumping = true |
None |
|
|
|
Jump-Idle |
Jumping = false |
None |
|
|
|
В дополнение к параметрам, имеющим вид меню, вам предоставляется еще и визуальный интерфейс, расположенный, как показано на рис. 7.18, непосредственно над списком Condition. Этот график позволяет визуально корректировать продолжительность перехода. Заданное по умолчанию время перехода прекрасно подходит для переходов из Idle в Run и обратно, а вот переходы в состояние Jump и из него должны совершаться быстрее. Окрашенная область графика показывает, сколько времени займет переход; одновременное нажатие клавиши Alt и левой кнопки мыши даст возможность панорамирования графика, а клавиша Alt с правой кнопкой мыши позволит выполнить масштабирование (аналогичные способы управления применяются для представления Scene). Воспользуйтесь кнопками со стрелками над окрашенной областью, чтобы установить до менее 4 миллисекунд время всех трех связанных с прыжками переходов.
Напоследок можно усовершенствовать анимационную сеть, по очереди выделяя узлы и корректируя порядок переходов. На панели Inspector будет отображаться список всех переходов к выделенному узлу и от него; вы можете перетаскивать элементы