Добавить в корзинуПозвонить
Найти в Дзене

Разработка игры Maps. Часть 2

Цикл "Разработка игры Maps":
• Часть 1
• Часть 2 (вы здесь) Приветствую сограждан и не только! Разработка игры идет полным ходом вот уже неделю и я хотел бы поделиться успехами в этом деле. Сегодня речь пойдет о путях, по которым игрок может перемещаться. Как вы знаете из прошлой статьи, перемещение должно осуществляться по нарисованным путям (пунктирные линии на картинке в той статье). Я решил начать со следующего: есть несколько узлов (места, где пути пересекаются, или просто где происходят какие-то события), при нажатии на соседний узел игрок переходит на него, перемещаясь вдоль кривой. И думалось мне, что это будет не очень сложно. Ага, щас... Начать стоит с того, что в Unity (а делаю игру я именно в ней) по умолчанию нет нормальных средств работы с кривыми. Поняв это, полез в ютуб, а затем в документацию юньки. В итоге нашел то, что мне показалось подходящим - встроенный пакет Splines. Подключив пакет к проекту, я приступил к его изучению. К слову, на начальном этапе мне очень по

Цикл "Разработка игры Maps":
Часть 1
Часть 2 (вы здесь)

Приветствую сограждан и не только! Разработка игры идет полным ходом вот уже неделю и я хотел бы поделиться успехами в этом деле. Сегодня речь пойдет о путях, по которым игрок может перемещаться.

Как вы знаете из прошлой статьи, перемещение должно осуществляться по нарисованным путям (пунктирные линии на картинке в той статье). Я решил начать со следующего: есть несколько узлов (места, где пути пересекаются, или просто где происходят какие-то события), при нажатии на соседний узел игрок переходит на него, перемещаясь вдоль кривой. И думалось мне, что это будет не очень сложно. Ага, щас...

Начать стоит с того, что в Unity (а делаю игру я именно в ней) по умолчанию нет нормальных средств работы с кривыми. Поняв это, полез в ютуб, а затем в документацию юньки. В итоге нашел то, что мне показалось подходящим - встроенный пакет Splines. Подключив пакет к проекту, я приступил к его изучению. К слову, на начальном этапе мне очень помог обыкновенный индус с ютуба.

Индусы ютуба - друзья разработчиков со всего мира!
Индусы ютуба - друзья разработчиков со всего мира!

Поначалу пакет Splines мне очень понравился. С его помощью можно легко расставлять узлы на сцене, создавать новые сплайны, соединять друг с другом, генерировать объекты вдоль сплайнов... В общем, песня. Используя генерацию вдоль сплайна, я стал создавать те самые пунктирные линии - пути. Вот как это выглядит:

Пробы пера в использовании Splines
Пробы пера в использовании Splines
Пример пути. Примерно такой он и будет в игре
Пример пути. Примерно такой он и будет в игре

Относительно визуализации путей возникла проблема - они плохо рисовались в местах пересечения разных сплайнов. Под "плохо" я подразумеваю плохо с визуальной точки зрения.

На "перекрестке" происходит что-то непонятное
На "перекрестке" происходит что-то непонятное

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

Убрал в стороны два лишних прямоугольника (слева снизу и справа сверху). Далее их можно удалить, а неудаленные подвигать
Убрал в стороны два лишних прямоугольника (слева снизу и справа сверху). Далее их можно удалить, а неудаленные подвигать

Как вы понимаете, чтобы писать скрипты, нужно было разобраться в данном пакете, к чему я и приступил. С одной стороны, я читал документацию, с другой - смотрел исходники с кодом. И знаете что? Это было больно. Правда. Я читал все это и очень хотелось взглянуть на разработчика пакета... Вот только не затем, чтобы отблагодарить.

Начнем с того, что документация написана криво. В одних местах узлы называются knots, уже на следующей строке пишется о bezier knots, а это то же самое. Непонятно работающие методы с непонятными параметрами, отсутствие базовых вещей типа метода Contains() для некоторых коллекций узлов... Короче говоря, разбираться мне пришлось прилично и временами наступал маленький геноцид нервных клеток

Загадка от Жака Фреско: что такое index для кривой? Особенно учитывая, что в эдиторе Юнити никаких объектов "кривая" у сплайна нет
Загадка от Жака Фреско: что такое index для кривой? Особенно учитывая, что в эдиторе Юнити никаких объектов "кривая" у сплайна нет
Изучение пакета Splines - документальный скрин
Изучение пакета Splines - документальный скрин

В общем пописал немного тестовые скрипты, поразбирался и наконец более-менее освоил инструментарий. У кого-то может возникнуть вопрос, почему же я использовал этот пакет, если понял, что он плох? А лучше-то и нет скорее всего. По крайней мере в области бесплатных ассетов - как уже упоминалось в первой статье, покупать что-то на данном этапе я не готов. Можно конечно написать свой пакет... Только вот это гораааздо дольше написания логики всей игры. Так что приходится мириться!

Что же вышло в итоге? Я хотел реализовать следующий функционал - изначально игрок стоит. Как только он кликает мышкой на узел, происходит проверка на соседство текущего узла и узла-цели. Если узел соседний - мы двигаемся, если между данными узлами есть еще какой-то - не двигаемся. Если освоить пакет, то реализовать такое не особо тяжело, просто надо посидеть и покумекать в некоторых моментах. Кому будет интересно взглянуть на кодовую часть - в конце статьи я оставлю ссылку на репозиторий GitHub. Кодеры смогут заценить мемность Splines ну и моего кода конечно же.

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

Собственно, опосля всех моих мучений вы можете лицезреть то, что получилось в итоге. То, что мы имеем на данный момент. Кому лень смотреть тридцатисекундное видео - зеленая колбаса (игрок) движется от одного узла (красной точки) к другому - вариант телепортационный (был промежуточным) и непрерывный.

Видео:
Перемещение телепортом (тестовое)
Перемещение непрерывное

Теперь я намерен добавить немного красок и смысла в игру - нарисую несколько спрайтов и реализую диалоговую систему. Рисовать будем, товарищи! Поэтому уже в следующей статье вы скорее всего увидите небольшой кусок первой карты с геймплеем. А на этом я с вами прощаюсь, увидимся в следующей части!

ВК: https://vk.com/lithemross
Репозиторий на GitHub:
https://github.com/LithemRoss/Maps.git