Инверсная кинематика IK в UDK: Постановка стоп персонажа на поверхности

Создавая современную игру, нельзя упускать из виду такой важный момент, как соответствие положения ног персонажа поверхности, на которой он находится. Если персонаж стоит на лестнице, то одна нога должна стоять на одной ступеньке, а вторая — на другой. Аналогично при ходьбе по наклонной поверхности стопы должны находиться на разном уровне. Более того, поверхность стопы должна точно соответствовать нормали поверхности, на которой она находится.

Инверсная кинематика IK в UDKВ UDK есть встроенная поддержка постановки стоп, но она, почему-то, мало у кого работает, судя по множеству вопросов на официальном форуме Epic Games. У меня также не получилось заставить ее работать, да и в документации по скелетным контроллерам написано, что она годится только для стоящей на месте модели, а для ходьбы и бега все-равно придется шаманить.

Поэтому многие берутся за создание собственной системы IK для постановки стоп в UDK. Я тоже решил более глубоко разобраться в этом вопросе, потому как это точно пригодится в будущем для разработки более сложных систем с лазаньем по лестницам и стенам, хватанием за карнизы и прочего паркура.



( Итак, приступим... )

Удаление компонента в Unity

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

Еще перед созданием отладочного кода я понял, что временные объекты должны создаваться без компонента Collider. Для этого я писал такой код (на C#):


    // Создаем примитив - сферу
    GameObject GO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
    // Удаляем компонент SphereCollider
    GameObject.Destroy(GO.GetComponent<SphereCollider>());


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

( Читать дальше )

Алгоритм поиска пути в Unity [1]

В посте про создание NPC в Unity я дал пару ссылок на уже готовые решения и представил примерный алгоритм поиска пути для самостоятельного создания основы AI для игрового бота (NPC). Сегодня поделюсь результатами, которые мне удалось реализовать в Unity.

Работа алгоритма поиска пути в Unity

( Читать дальше )

Создание NPC в Unity - Поиск пути

Практически в любой игре, кроме разве что головоломок или match 3, встречаются так называемые NPC (Non-Player Characters) — неигровые персонажи или попросту «боты». Поведением NPC или бота заведует ИИИ (игровой искусственные интеллект). И основная наиболее распространенная задача для ИИИ — поиск пути на игровой карте для перемещения ботов.

Для реализации поиска пути в Unity3D уже существует несколько готовых решений. Это Path от AngryAnt и A* Pathfinding Project от Aron Granberg. Первое можно использовать, если вас не смущает четырехсекундное лого автора в начале вашей игры. В противном случае нужно обращаться к разработчику за индивидуальными условиями лицензирования. Второе решение четко разграничивает бесплатную Lite и платную Pro версии.

Я же попробую реализовать самостоятельно один из описанных в интернете алгоритмов поиска пути. Так будет больше понимания и контроля за результатом работы, что позволит оптимизировать алгоритм для лучшей производительности в каждом конкретном случае.

( Читать дальше )