Контроллер персонажа на Unity
Я ни в коем случае не могу назвать себя хорошим программистом или опытным разработчиком игр, но все же хотел бы предложить мой вариант реализации перемещения персонажа.
Данный способ подойдет для реализации игр с видом сверху, при небольших переделках можно использовать и для игры с видом от третьего лица. Можно использовать как для персонажей, управляемых игроком, так и для ботов.
Здесь показаны основные элементы проекта, но лучше детально его изучить, если захотите использовать у себя.
Предлагаю минимальный набор скриптов и материалов для реализации перемещения, если нужно что-то более сложное, то придется доработать скрипты или можно у меня спросить, я помогу :)
Состав проекта
Аниматор
Аниматор состоит из двух BlendTree, одно для перемещения персонажа, а второе для поворотов на месте.
BlendTree для поворотов очень простой, состоит из двух анимаций. Одна для поворота направо, а вторая для поворота налево.
BlendTree для перемещения куда сложнее, он состоит из 9 анимаций, 8 отвечают за направление движения и 1 для неподвижного положения
Скрипты
Скрипты - самое главное. Я же программистом работаю :)
Всего используется два скрипта, один отвечает за перемещение, а второй передает первому скрипту инфу о нажатых кнопках.
Не буду показывать здесь полностью весь код, покажу основные методы. Их всего 3.
Метод, отвечающий за перемещение персонажа вызывается каждый кадр, в него передаются координаты цели, вектор, содержащий инфу о том, куда идти персонажу (x - движение вправо или влево, 1 - вправо, -1 - влево, 0 - на месте; y - не используется, но можно использовать для переключения на ходьбу например; z - перемещение вперед или назад, 1 - вперед, -1 - назад, 0 - на месте) и время между кадрами.
Метод, отвечающий за поворот персонажа, в него передаются координаты цели, флаг, отвечающий за необходимость поворота с помощью анимации и время между кадрами. Это довольно сложный код, если интересно в нем разобраться, то пишите, я помогу.
Метод, который проверяет нажатия игрока, и на основе этих данных возвращает нужные значения для контроллера, который отвечает за перемещение игрока. Принимает время между кадрами, а возвращает нужный вектор для перемещения персонажа и координаты его цели
Префаб персонажа
Это совсем легко, на персонаже висит два скрипта, один ловит нажатия на кнопки, а второй заставляет двигаться. Все просто.
Для того, чтобы персонаж не проходил сквозь стены, я использую NavMesh, если на персонаже висит агент, то он не сможет пройти туда, куда нельзя, но для этого надо запечь карту путей :)
Итог
Я очень давно использую именно этот скрипт для реализации перемещения в своих играх, если кому-то еще они пригодятся, то это было бы здорово.
Если такой формат кому-то интересен или что-то лучше поменять, то напишите в комментах - это позволит сделать более полезный контент в будущем, а если у вас есть какой-то конкретный вопрос, то пишите тоже, постараюсь разобрать :)
Отличный материал, особенно круто построчное комментирование — более чем полезно начинающим. Хвалю за вложенный труд!,)
Мне так же нравится, что персонаж правильно переступает при вращении. Не дай боги какая инновация, но всё чаще замечаю, что в ряде не самых дешёвых игр нет (или сделано так себе) и этого базового момента, особенно, у NPС такое встречается чаще.
Спасибо, могу показать как научить ботов так же чётко ходить по навмешу)
Боты ходят по навмешу с правильным перебором ног)
https://dtf.ru/s/unity/599670-prostaya-perestrelka-mezhdu-botami-na-unity
Зачем комментировать каждую строчку?
Это только в статье, чтобы проще разобраться было
Ну.. не все такие умные люди. Многи нужна документация пподробная, а не тупо в виде примеров.
Мне нравиться документация traefik где пишут пример, и дальше новое по строчно расписвают что делает, а вот уже варианты в документации есть, но что они будут делать уже понятно.
Большинство гавно роликов и прочего на юутбе это делай говно как я, хз зачем оно и как, но я сделал и оно вроде бы работает. Это раздражает.
Хороший материал показывает что можно сделать так, или вот так, и упомнять другие варианты которыевозомжно будут лучше в других случаях, но поясняет почему текущий вариант лучше других.
В общем видимо не такой уж и Умный человек, раз никогда ничего не делал и не учил других - не понимает зачем это.
Отличный материал
Спасибо за труд!