| | ||
| | ||
| | ||
| |
Цвет линий | | | |
Цвет соединителя | | | |
Тип соединителя | | | |
| | ||
Кучность линий | | |
Опубликовано: 31.12.2021 в 17:53
С нашей последней записи минуло уже много месяцев. Столь большие интервалы между новостями, мягко говоря, удручают. Это связанно с незначительностью вносимых изменений. Сами посудите, кому будет интересно читать, как мы исправляли очередной баг?
Дабы новости выходили чаще, я решил, преодолевая стыд и страх, публиковать свои учебные проекты.
Перефразируя одного лысого мужика:
Отец научил нас не стесняться своих костылей. Особенно учитывая, какие они большие.
Идеально подошло бы для эпиграфа, но мы отвлеклись.
Сегодня, в роли учебного проекта выступает прототип стратегии, по совместительству являющийся моим курсовым.
Сразу оговорюсь, я сознательно свёл к минимуму работу с визуальной частью, по возможности пользуясь предустановленными в движке моделями и спрайтами, так как тогда меня интересовало не создание полноценной игры, а непосредственное написание кода. Глядя на созданное мною нечто, прошу держать это в голове.
Проект был реализован на Unreal Engine 4 (далее UE4). Движок крайне интересный, подробнее останавливаться на нём, я, конечно же, не буду.
Приступая к разработке любого проекта сложнее калькулятора, необходимо ясное представление, что ты хочешь получить в конце и хотя-бы приблизительное понимание, как оно должно быть реализовано. У меня не было ни того, ни другого. Мои лишённые конкретики знания, ограничивались тем, что я делаю стратегию, в которой игрок будет управлять солдатами с огнестрельным оружием. В будущем это создаст множество проблем.
Но а пока я, ещё будучи полон сил, написал класс игрока. Класс состоит из камеры и так называемого Spring Arm, который представляет собой невидимый рычаг, начало которого всегда находится на координатах игрока. На противоположном конце этого объекта я закрепил камеру. Вот как это выглядит:
Подобный механизм позволяет вращать камеру вокруг объекта, контролируя расстояние до него.
При движении мы просто меняем координату игрока, при повороте крутим Spring Arm, а при приближении уменьшаем размер нашего рычага, одновременно меняя его вертикальный угол.
Вслед за этим, я создал базовый класс солдата, включающий в себя модель и декаль. Если модель я мог взять из UE4, то декаль пришлось делать самому. Для этого было достаточно нарисовать простое кольцо в первом попавшемся графическом редакторе, а потом создать на его основе материал:
Добавив необходимые объекты, я приступил к созданию функционала. В контроллер был добавлен массив, в который записывались выделенные юниты. Запись и удаление из этого массива происходила в функциях, расположенных в классе солдата. Эти функции также переключали видимость декали. Вызов этих функций происходил при клике на солдата.
Затем, при помощи класса, унаследованного от HUD, я сделал отрисовку прямоугольника поверх интерфейса и заставил всех угодивших внутрь фигуры юнитов выделяться.
И вот, перед нами уже стоит несколько беспомощных солдат, которых мы можем выделять всеми возможными способами.
Пока эти новобранцы умеют только стоять на месте. Давайте научим их бегать. Здесь всё довольно просто. Создаём переменную с целевыми координатами, и, если переменная задана, а солдат ещё не достиг указанных в ней координат, то приказываем ему выдвигаться туда.
Не смотря на моё нежелание заморачиваться над визуальной частью проекта, я всё же добавил анимации. Разумеется, делать их самому мне было лень у меня не было времени, поэтому я просто скачал бесплатный ассет из Epic Games. Правда, просто вставить анимации в проект не получится, так как они должны не просто проигрываться, а плавно перетекать из одного состояния в другое.
Мы воспользуемся встроенным в UE4 средством для работы с анимациями под названием Animation Blueprint. При этом, его функционал не ограничивается добавлением плавных переходов. Например, с его помощью я привязал левую руку солдата к цевью винтовки. Теперь, даже при беге анимация подстраивается под поведение винтовки. Также, теперь мы можем контролировать направление выстрела солдата.
Укомплектованный анимациями солдат выглядит куда интереснее:
После реализации прицеливания, дело осталось за малым: во время атаки добавлять в ствол запрограммированную лететь по параболе пулю.
Теперь наши новобранцы научились бегать и стрелять. Правда, пока-что они бессмертны. Не будем гневить богов и научим солдат умирать. В реализации смерти нет ничего сложного. Когда пуля касается солдата, мы удаляем пулю и просто включаем скелету солдата физику. Получаем вот такой эффект:
Затем, я модифицировал систему атаки, научив ботов самостоятельно выбирать себе цель.
До этого момента, я реализовывал довольно часто встречающиеся в стратегиях механики. Затем, я начал добавлять всякую экзотику. Причём, добавляемые механики я придумывал буквально на ходу. Никогда так не делайте, не повторяйте мои ошибки.
Например, я захотел добавить управление режимом перемещения солдат:
“Раз теперь солдаты умеют садиться, почему-бы не добавить им укрытия, за которыми они смогли-бы таким образом прятаться?" - думал я, продолжая копать себе яму.
“Раз теперь у меня есть фантомы, указывающие вероятные места за препятствиями, почему-бы не использовать их для простого перемещения по карте?” - не унималась моя тёмная сторона.
“АСТАНАВИТЕСЬ” - пытался перекричать её голос разума.
Уже на этом этапе, отсутствие планирования начало давать свои первые плоды: код некоторых функций стремительно разрастался, ака финансовый сектор в предкризисный период, часть классов получали функции никак к ним не относящиеся, а лишние переменные множились со скоростью бегущих из Крыма белых. Это делало код всё более запутанным. По хорошему, уже на этом этапе мне стоило прислушаться к голосу разума, но увы, я этого не сделал. Работа продолжалась, запутанность кода порождала ещё большие костыли, которые, в свою очередь, порождали ещё большую запутанность. Цикл раз за разом воспроизводил сам себя.
Так, я реализовал трёхступенчатую систему ИИ, которую я хотел использовать в одной из наших будущих игр. На примере разберу, как она работает:
У нас есть сержант. Он определяет, какую зону должны захватывать подчиняющиеся ему офицеры. Зная расположение врагов, он определяет, куда следовать офицерам.
Офицеры, зная, куда им нужно бежать, ищут ближайшие препятствия, передвигаясь между которыми, отряд мог-бы безопасно добраться до места. Координаты этих препятствий передаются солдатам.
Солдаты, получая координаты, бегут туда. Если они заметили врага, они, прибыв на место, его атакуют.
Со стороны она выглядит так:
Примечание: с этого момента у меня появляется новый монитор, после чего частота кадров на видео значительно упала. К сожалению, я заметил это слишком поздно. Прошу не закидывать меня тапками.
А дальше у меня начали гореть все возможные ср(о/а)ки. Попытки написать что-то новое сталкивались с целой кучей препятствий в виде гор из костылей и болот из лишних переменных. Только тогда, подгоняемый временем и моим товарищем, с которым нам надо было начинать новый проект, я взял себя в руки и переписал игру с нуля, на этот раз уже точно зная, что и как я буду делать. К сожалению, из-за спешки я очень сильно урезал проект. Тем не менее, я добавил туда свои модели и на их основе написал простенький генератор руин, в которых солдаты будут прятаться. Знакомьтесь, вот так выглядит новоиспечённый проект:
Остаток времени я потратил на добавление разных фич. Например, выделение юнитов отрядами и, вытекающее из него, выделение всех возможных мест в определённой зоне.
Также я замедлил пулю, тем самым сделав её баллистику более заметной и реализовал разброс, напрямую зависящий от расстояния от стреляющего до цели.
На этом этапе, сама игра была готова, а после добавления главного меню, паузы и загрузки, я закончил работу над проектом, приступив к написанию разнообразных отчётов.
Как говорил дед одного честного и неподкупного журналиста:"Вы хотите тотальной войны?!"
Итогом моей работы стал простой прототип стратегии. Сейчас я мог бы реализовать его за неделю, но из-за поспешности, работа над ним заняла гораздо большее время, которое мне ужасно жаль, как и функционал, не попавший в курсовой проект. Зато, набив себе мозоли, я усвоил важный урок. Исходники самого проекта вы можете скачать ссылке ниже:
https://github.com/RedMarshall37/SimpleStrategy
А всех, кто это читает, я поздравляю с наступающим Новым Годом. Улыбнитесь, вы среди выживших!)
Комментариев не найдено.