Контроллеры персонажа (Character Controllers)
Персонажу в игре от первого или третьего лица часто требуется некоторая физика основанная на столкновениях, чтобы он не падал сквозь пол или не ходил сквозь стены. Обычно, всё же ускорение и движение персонажа физически нереалистичны, таким образом он может ускоряться, тормозить и менять направление мгновенно, не подвергаясь влиянию импульса.
В 3D физике этот тип поведения можно создать используя Character Controller. Этот компонент даёт персонажу простой коллайдер в форме капсулы, который всегда находится в вертикальном положении. У Controller’а есть свои особые функции для назначения скорости и направления объекта, но, в отличие от настоящих коллайдеров, он не требует Rigidbody и его эффекты импульса нереалистичны.
Character Controller не может проходить сквозь Static коллайдеры в сцене, поэтому он будет двигаться по полу и блокироваться стенами. Во время движения он может отталкивать Rigidbody объекты, но входящие столкновения не будут влиять на его ускорение. Это значит, что вы можете использовать стандартные 3D коллайдеры, чтобы создать сцену по которой будет ходить Controller, но вы не ограничены реалистичным, с точки зрения физики, поведением самого персонажа.
You can find out more about character controllers on the reference page.
Character Controller
Компонент Character Controller в основном используется для управления от третьего или первого лица, где не требуется физика Rigidbody .
Свойства
Свойство: | Функция: |
---|---|
Slope Limit | Ограничивает возможность коллайдер взбираться по склонам только по склонам равным или меньше чем указанное значение. |
Step Offset | Персонаж переступит на поверхность, только если она ближе к земле, чем заданное значение. |
Skin width | 2 коллайдера могут пересечься друг с другом на глубину, равную значению Skin Width. Большее значение уменьшит степень тряски. Слишком низкое значение может вызвать застревание персонажа. Наилучшим вариантом является установление этого значения равным 10% от радиуса. |
Min Move Distance | Если персонаж попробует сдвинуться ниже указанной величины, то он не сдвинется. Это может быть использовано, чтобы уменьшить тряску. В большинстве ситуаций это значение стоит оставить равным нулю(0). |
Center | Сдвиг коллайдера в мировом пространстве без влияния на то, как вращается персонаж. |
Radius | Значение радиуса коллайдера. По сути дела, это ширина коллайдера. |
Height | Высота коллайдера Capsule Collider персонажа. Изменение её растянет коллайдер вдоль оси X в оба направления. |
Детали
Традиционное управление от первого лица в стиле Doom не реалистично, с точки зрения физики. Персонаж бежит со скоростью 90 миль в час, останавливается мгновенно и поворачивается за считанные мгновения. Т.к. это нереалистично, использование Rigidbody и физики чтобы создать подобное управление непрактично и эффект будет не тот. Решением является специализированный Character Controller. Он просто создаёт коллайдер ( Collider ) в форме капсулы, который можно двигать в некотором направление при помощи скрипта. Controller позаботится о движении, но столкновения его сдерживают. Он будет скользить вдоль стен, подыматься по лестницам (если ступеньки ниже чем Step Offset ) и ходить по наклонам учитывая Slope Limit .
Controller не реагирует на силы сам по себе и не отталкивает Rigidbody объекты автоматически.
Если вы хотите толкать Rigidbody-тела или объекты, использующие Character Controller, вы можете применить силы к любому объекту, в которого он врезается, через скриптинг при помощи функции OnControllerColliderHit() .
С другой стороны, если вы хотите, чтобы персонаж игрока подвергался влиянию физику, то возможно вам было бы лучше использовать Rigidbody вместо Character Controller.
Настройка персонажа до желаемого результата
Вы можете менять значения Height и Radius для соответствия коллайдера мешу персонажа. Для человекоподобных персонажей рекомендуется использовать высоту около 2-х метров. Вы также можете изменить центр ( Center ) капсулы в случае, если точка вращения (pivot) не соответствует точному центру персонажа.
Значение Step Offset тоже важно при настройке, убедитесь, что это значение находится в диапазоне между 0.1 и 0.4 для 2-х метровых гуманоидов.
Slope Limit тоже должен быть не слишком маленьким. Зачастую использование значения в 90 градусов подходит лучше всего. Character Controller не сможет ползать по стена в виду формы капсулы.
Как не застрять
Skin Width одно из самых критических свойств для верной настройки Character Controller. Если вам персонаж застрял, то скорее всего ваше значение Skin Width слишком мало. Skin Width позволяет объектам слегка пересекать Controller, но уменьшает тряску и защищает от застревания.
Достаточно неплохой практикой является сохранение значения Skin Width как минимум больше чем 0.01 и и больше чем 10% радиуса коллайдера ( Radius ).
Мы рекомендуем оставлять значение Min Move Distance равным 0.
См. справку по скриптингу Character Controller здесь
Вы можете скачать проект-пример, демонстрирующий предустановленных анимированных и движущихся Character Controller’ов, с нашего вебсайта здесь Resources
Советы
- Попробуйте настроить значение Skin Width , если ваш персонаж застревает достаточно часто.
- Character Controller может влиять на объекты использующие физику, если вы пишете свои скрипты.
- На Character Controller не могут влиять объекты при помощи физики.
- Учтите, что изменение свойств компонента Character Controller в инспектора повлечёт пересоздание контроллера в сцене, таким образом, любые существующий контракты-триггеры будут потеряны и у вы не получите сообщение OnTriggerEntered, пока контроллер не продолжит движение.
Подготовка своего персонажа
Существует три главных шага по созданию “с нуля” своего анимированного гуманоидного персонажа: моделирование, риггинг и скиннинг.
Моделирование
Это процесс создания своих гуманоидных мешей в одном из инструментов 3D моделирования — 3DSMax, Maya, Blender, и т.д. Хоть это и целая тема для обсуждения сама по себе, существует несколько принципов, которые рекомендуется соблюдать, чтобы ваша модель была совместима с анимацией в Unity проекте.
- Соблюдайте разумную топологию. Понятие “разумной” структуры вашего меша довольно тонкое, но в целом вам следуем помнить о том, как вершины и треугольники модели будут искажаться при анимации. Неправильная топология приведёт к неприятным искажениям меша при движениях модели. Изучая существующие 3D меши персонажей, можно узнать много нового о том, как правильно размещать топологию и почему.
- Не забывайте про масштаб вашего меша. Попробуйте импортировать модель и сопоставить её размер с “метрическим кубом” (длина одной стороны стандартного Unity примитива “куб” равна одной условной единице, так что такой примитив можно рассматривать как однометровый куб в большинстве случаев). Проверьте единицы измерения вашего приложения для 3D моделирования и скорректируйте настройки экспорта так, чтобы размер модели был в нужных вам пропорциях к метровому кубу. Если не учитывать это при работе над моделями, легко прийти к ситуации, когда вы создадите несколько разных моделей без учёта масштаба и они окажутся несоразмерны после импорта в Unity.
- Располагайте меш так, чтобы ступня персонажа находилась в центре вращения модели. Так как обычно персонаж ходит по горизонтальной поверхности, будет намного проще с ним работать, если его центр вращения(то есть, его позиция трансформации) будет на этой поверхности.
- По возможности, моделируйте в Т-позе. Это даст дополнительное пространство для манёвра при работе над труднодоступными местами (например, подмышками). Кроме того, это упростит размещение рига внутри меша.
- Держите модель в порядке. Не оставляйте дырок в поверхности, объединяйте вершины и избавляйтесь от скрытых поверхностей, которые никогда не будут видны. Это поможет при скиннинге, особенно если скиннинг автоматизирован.
Риггинг
Это процесс создания скелета из сочленений для управления движениями вашей модели.
Программы для 3D моделирования предоставляют множество инструментов создания сочленений гуманоидного рига. От уже готовых скелетов, которые достаточно отмасштабировать под свою модель, до средств создания отдельных костей и объединения их в костную структуру. Чтобы риг работал с Mecanim, таз должен быть корневым элементом всей иерархии костей и в скелете должно быть не менее 15 костей.
Иерархия сочленение/кость должна соответствовать натуральной структуре создаваемого персонажа. Поэтому руки и ноги должны идти в парах и вам следует соответствующе их называть (напр. “arm_L” для левой руки, “arm_R” для правой и т.д.). Возможные структуры иерархии:-
- Таз — позвоночник — грудная клетка — плечи — рука — предплечье — кисть
- Таз — позвоночник — грудная клетка — шея — голова
- Таз — бедро — нога — ступня — палец — конец_пальца
Скиннинг
Это процесс привязки меша к скелету.
Скиннинг включает в себя связывание вершин в вашем меше с костями скелета. Вершина может быть связана с костью напрямую (жёсткая привязка) или с несколькими костями, используя на них смешанные воздействия (мягкая привязка). В разных программах используются разные способы, например, привязывание отдельных вершин и вписывание в меш степени воздействия на каждую кость. Изначальная настройка обычно автоматизирована, к примеру, с помощью поиска ближайшего воздействия, или с помощью “heatmap”. Обычно скиннинг требует изрядного количества работы и тестирования с помощью анимаций, чтобы достичь желаемых результатов деформации скина. Вот несколько основных рекомендаций для этого процесса:
- Используйте автоматизацию для начальной настройки скиннинга (см. соответствующие руководства для 3DMax, Maya и т.д.).
- Создавайте простые анимации или импортируйте готовые анимации для своего рига, чтобы проверить скиннинг. Это позволит вам быстро выяснить, хорошо ли выглядит ваш скиннинг во время движения.
- Постепенно редактируйте и улучшайте свою работу по скиннингу.
- Используйте не более 4 воздействий при использовании мягкой привязки, т.к. это наибольшее количество, которое может использовать Untiy. Если к части меша будет применено более четырёх воздействий, то как минимум часть информации будет потеряна при проигрывании анимации в Unity.
Как работает Unity Character Controller (Контроллер Персонажа)?
Команда Unity3D заботится о рядовых пользователях и разработчиках игр. Поэтому в Unity была введена интересная система, называется она – Character Controller, а по русски – Контроллер Персонажа. Что же она делает и для чего вообще нужна? В основном она используется для управления персонажем от первого или третьего лица без использования физики Rigidbody.
Итак для начала нам следует подготовить сцену. Создадим Terrain, Меню GameObject>3d Object>Terrain
И создадим заготовку нашего персонажа. Для этого опять, Меню GameObject>Create Empty и назовем его Player. Затем делаем нашу камеру дочерней нашему свежесозданному Player.
Теперь добавим плееру компонент Character Controller. Для этого в окне инспектора нажмем кнопку Add Component и в появившемся списке в пункте Physics нажмем на Character Controller.
Когда контроллер персонажа добавлен к нашей заготовке, рассмотрим подробнее поля его настроек.
Slope Limit: этот параметр ограничивает возможность персонажу взбираться на различные препятствия. Например, по умолчанию стоит число 45, это значит, что если угол препятствия больше 45 градусов, то персонаж на него не сможет взобраться.
Step Offset: персонаж будет подниматься по лестнице, только если он ближе к земле, чем указанное значение.
Skin width: 2 коллайдера могут пересечься друг с другом на глубину, равную значению Skin Width.
Min Move Distance: если персонаж пытается переместиться ниже указанного значения, он не будет двигаться вообще.
Center: сдвиг коллайдера контроллера.
Radius: радиус коллайдера контроллера. Определяет, насколько жирный получился персонаж.
Height: высота коллайдера. Ну и, соответственно, высота контроллера. Например, если сделать это значение выше высоты дверных проемов, то персонаж просто застрянет в них.
Пока все значения оставим по умолчанию. В дальнейшем можно поменять их для лучшей работы контроллера. И как, это не странно, подготовка персонажа готова. Нам осталось написать небольшой скрипт управления камерой и нашим контроллером и персонаж будет готов.
Создадим новый скрипт под названием Player. Этот скрипт нам нужен для отдачи команд CharacterController, который и будет их выполнять, двигая и поворачивая персонажа. Для этого выберем в иерархии нашего персонажа и в инспекторе нажмем Add Component. Далее, в конце появившегося списка, нажимаем New Script, в появившемся поле ввода вводим название скрипта, в нашем случае – Player.
Завершающие действие – это кнопка Create and Add. Нажимаем! Отлично, скрипт создан и добавлен к нашему персонажу!
Откроем его, кликнув по его имени два раза.
В этом скрипте нам надо обьявить три переменные. Первая – это ссылка на CharaсterController. Вторая – скорость движения. Третья-скорость поворота. И укажем им значения по умолчанию 1 и 3 соответственно.
В методе Start, который, как мы знаем, вызывается при старте сцены, добавим строку, которая найдет и добавит компонент CharacterController к нашей переменной. Конечно же, при условии, что он присутствует на том же GameObject что и наш скрипт.
Теперь переходим к методу Update. Этот метод вызывается каждый кадр. В него для начала добавим строку, которая поворачивает наш персонаж вокруг оси Y, посредством клавиш leftArrow и RightArrow.
Затем мы задаем, куда нам двигаться. Точнее – вектор направления. Он у нас forward или z.
Затем мы устанавливаем скорость движения. В зависимости от того, какая клавиша нажата, она положительная или отрицательная. То есть вперед и назад.
И наконец, собираем все это вместе и передаем на Character Controller.
Сохраняем наш скрипт и переходим в Unity. На нашем персонаже должно быть два скрипта Charaster Controller и Player.
Жмем Play и стрелочками на клавиатуре двигаем и поворачиваем нашего персонажа. Урааа, побежали!