Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unity_в_действии_Джозеф_Хокинг_Рус.pdf
Скачиваний:
83
Добавлен:
21.06.2022
Размер:
26.33 Mб
Скачать

178      Глава 7. Игра от третьего лица: перемещение и анимация игрока

Данные о столкновении включают в себя свойство normal (еще раз напомню, что нормалью называется вектор, определяющий лицевую сторону полигона), указывающее направление ухода от точки столкновения. Но есть один тонкий момент. Мы хотим, чтобы небольшой импульс в сторону от точки контакта обрабатывался в зависимости от того, в каком направлении двигался персонаж. Если предшествующее движение по горизонтали совершалось в сторону платформы, его следует заменить, чтобы персонаж не продолжал смещаться в некорректном направлении. Если же лицом он был повернут в сторону от края, предшествующее движение по горизонтали нужно добавить, чтобы сохранить толкающий вперед импульс. Направление вектора движения относительно точки столкновения определяется при помощи

скалярного произведения.

ОПРЕДЕЛЕНИЕ  Скалярным произведением (dot product) называется математическая операция, выполняемая с двумя векторами. Коротко говоря, результат такого произведения варьируется между –1 и 1, где 1 означает, что вектора смотрят в одном направлении, в то время как –1 указывает на диаметрально противоположные направления. Не следует путать скалярное произведение с векторным произведением — другой математической операцией, часто применяемой к векторам.

Объект Vector3 обладает методом Dot(), вычисляющим скалярное произведение двух векторов. Скалярное произведение вектора движения и нормали плоскости столкновения будет отрицательным, если эти вектора смотрят в разные стороны, и положительным при их одинаковом направлении.

В конце листинга 7.5 появляется новый метод. Ранее мы проверяли нормаль плоскости столкновения, но откуда появлялась информация об этой нормали? Оказывается, о столкновениях с контроллером персонажа сообщалось через функцию обратного вызова OnControllerColliderHit(), предоставляемую классом MonoBehaviour; для программирования реакции на данные о столкновении в каком-либо фрагменте сценария следует сохранить эти данные во внешней переменной. Именно этим занимается наш метод: сохраняет данные о столкновении в переменной _contact, предоставляя нам возможность воспользоваться этими данными в методе Update().

Итак, мы скорректировали поведение персонажа на краях платформ и на наклонной плоскости. Запустите игру и посмотрите, что происходит при сходе с края и при попытке запрыгнуть на крутой склон. Наш демонстрационный ролик почти готов. Персонаж нужным образом перемещается по сцене, осталось только придать ему более естественную позу.

7.4. Анимация персонажа

Кроме более сложной формы, определенной сеточной геометрией, наш антропоморфный персонаж нуждается еще и в анимации. В главе 4 вы узнали, что анимация представляет собой пакет информации, определяющий движение связанного с ним трехмерного объекта. В качестве примера мы рассматривали ходящего по сцене персонажа. Именно эту ситуацию вам сейчас предстоит воспроизвести! Персонажу следует назначить анимацию, которая заставит его руки и ноги двигаться взад и вперед, как показано на рис. 7.11.

7.4. Анимация персонажа      179

Т а а а а ,

а Т-а

Рис. 7.11. Персонаж, двигающийся по сцене в процессе воспроизведения анимации

Хорошей аналогией трехмерной анимации является кукольный театр: трехмерные модели играют роль кукол, аниматор представляет собой кукловода, а анимация — это запись перемещений кукол. Существуют разные способы создания анимации; в большинстве современных игр для персонажей используется техника скелетной анимации.

ОПРЕДЕЛЕНИЕ  Скелетной анимацией (skeletal animation) называется процедура связывания с моделью набора костей, которые и осуществляют движение. В процессе перемещения кости двигается также связанная с ней поверхность модели.

Принцип скелетной анимации легко понять интуитивно, представив имитацию скелета персонажа (как показано на рис. 7.12). Но при этом «скелет» является абстракцией, применимой в любой ситуации, в которой вам нужна гибкая и деформирующаяся модель с четко определенной структурой, программирующей ее перемещения (к примеру, представьте извивающееся щупальце осьминога). Сами кости перемещаются как недеформируемые объекты, в то время как окружающая их поверхность модели может сгибаться и менять свою форму.

К ( Unity а)

В а а

 

 

 

К а ,

а а а••а

а а

Рис. 7.12. Скелетная анимация антропоморфного персонажа

Получение результата, показанного на рис. 7.11, включает в себя несколько этапов: для начала мы определяем анимационные клипы в импортированном файле, затем настраиваем контроллер для воспроизведения этих клипов и, наконец, вставляем

180      Глава 7. Игра от третьего лица: перемещение и анимация игрока

этот контроллер в наш код. Анимация персонажа будет воспроизводиться в соответствии с написанными вами сценариями движения.

Разумеется, первое, с чего нужно начать, — это подключить систему анимации. Выделите модель персонажа на вкладке Project и на панели Inspector перейдите на вкладку Animations, где убедитесь в наличии флажка Import Animation. Затем перейдите на вкладку Rig и выберите в раскрывающемся списке Animation Type вариант Humanoid (ведь у нас же антропоморфный персонаж). Обратите внимание на вариант Legacy; до появления системы Mecanim настройки Generic и Humanoid были объединены.

СИСТЕМА АНИМАЦИИ MECANIM

В Unity встроена сложная система управления анимацией моделей, которая называется Mecanim. Ее основу составляет скелетная анимация, с которой вы познакомитесь в этой главе. Имя Mecanim указывает, что это более новая усовершенствованная система анимации, добавленная как замена старой версии. Последняя до сих пор доступна через настройку Legacy, но есть вероятность, что в следующих версиях Unity ее уже не будет.

Хотя анимация, которую мы будем задействовать, включена в тот же самый FBX-файл, что и модель персонажа, одним из основных преимуществ системы Mecanim является возможность наложения анимации из других FBX-файлов. Например, все враги могут пользоваться одним набором анимационных клипов. Такой подход имеет ряд преимуществ, в числе прочего предоставляя возможность структурированного хранения данных (модели сохраняются в одной папке, в то время как анимационные ролики — в другой) и позволяя экономить время за счет анимации всех персонажей разом.

Щелкните на кнопке Apply в нижней части панели Inspector, чтобы применить выбранные настройки к импортированной модели, и продолжите работу над определением анимационных клипов.

ВНИМАНИЕ  На консоли может появиться предостережение (не ошибка) с текстом «conversion warning: spine3 is between humanoid transforms». На него можно не обращать внимания; он информирует о наличии в импортированной модели большего количества костей, чем ожидалось системой Mecanim.

7.4.1. Создание анимационных клипов для импортированной модели

Первым шагом по созданию анимации для персонажа будет подготовка отдельных клипов. Человек совершает разные движения в разное время. Аналогично и наш персонаж будет то бегать по сцене, то запрыгивать на платформы, то просто стоять с опущенными руками. Каждое из этих движений представляет собой «клип», который можно воспроизводить независимо.

Импортированная анимация зачастую выглядит как один длинный клип, который можно превратить в набор отдельных анимационных роликов. Это делается на вкладке Animations панели Inspector. Вы увидите там список Clips, показанный на рис. 7.13, — здесь перечислены все анимационные клипы, изначально входившие в состав единого импортированного клипа. Обратите внимание на кнопки со значками + (плюс)

и– (минус) в нижней части этого списка; они предназначены для добавления и удаления клипов. Для нашего персонажа потребуется четыре клипа, поэтому добавляйте

иудаляйте их по мере необходимости.

7.4. Анимация персонажа      181

 

К + – а

А а ,

а а

 

а

 

а а

 

а а

 

 

Рис. 7.13. Список Clips на вкладке Animation

После выбора клипа информация о нем появляется ниже, как показано на рис. 7.14. Первым идет поле с именем клипа, причем вы можете ввести новое имя. Присвойте нашему первому клипу имя idle. Теперь нужно задать параметры Start и End, определяющие первый и последний кадр выбранного клипа. Именно это позволит вырезать фрагмент из длинной импортированной анимации. Для клипа idle введите в поле Start значение 3, а в поле End — значение 141. Затем переходите к настройкам цикла.

И а а

а: а

а а

За а а а

а а

В

( а а

)

Ц • а а , а

а а а а ( ):

а а а ,

• — • , а а —

а а •

В а а а• а -а

( а• , • а ,

• а )

Рис. 7.14. Информация о выбранном анимационном клипе

ОПРЕДЕЛЕНИЕ  Цикл (loop) означает запись, которая воспроизводится снова и снова. Зацикленный анимационный клип сразу же после завершения воспроизведения запускается снова.

Наш клип должен воспроизводиться в цикле, поэтому установите флажки Loop Time и Loop Pose. Кстати, зеленый цвет индикаторной точки указывает, что позы персонажа в начале и в конце клипа совпадают, что означает корректность циклического воспроизведения. В случае отдельных несовпадений индикатор становится желтым, красный же цвет указывает на совершенно разные позы.

Ниже находится набор параметров, связанных с преобразованиями корневого элемента. Слово корневой в случае скелетной анимации имеет то же самое значение, что