Синглплеер про агрессивного снайпера основанного на одном из стилей игры в Counter Strike
Привет DTF! Сегодня я хочу рассказать о проекте над которым работаю последнее время, основанном на некоторых механиках Counter Strike, только переосмысленных под синглплеер.
Я очень люблю CS, убил в этой игре уже кучу часов, и недавно, увидев в сто тысячный раз как некоторые люди агрессивно играют со снайперской винтовкой, мне пришла идея сделать игру которая будет основана на философии агрессивного снайпера.
Немного о Counter Strike и происхождении понятия "агрессивного снайпера"
Заранее прошу прощения за контрстрайковский сленг, но говоря об этой игре спустя 1700 часов в ней очень тяжело находить замены привычным среди кс-серов словам.
Итак, как все мы знаем, CS это мультиплеерный тактический шутер где основной режим это игра 5x5. В игре представлены несколько видов оружия и среди них есть снайперская винтовка о которой сегодня и пойдет речь. Роль снайпера в команде - забирать дальние дистанции и часто "отпугивать" противника, так как стреляться с AWP (снайперская винтовка) это опасно, ибо одно его попадание по тебе и ты отправляешься ждать следующий раунд. Однако, у такой огневой мощи есть и цена - низкая мобильность и перезарядка после каждого выстрела в связи с чем, по большей части, если снайпер промахнулся - он умер. Ну, по крайней мере на уровне про игроков. В связи с чем по большей части снайперы встают исключительно в закрытые позиции, что бы в случае промаха у них был шанс спрятаться, отойти или вообще поменять позицию. Однако, на про сцене встречаются и сумасшедшие снайперы, которые не играют как большинство, а играют очень агрессивно: летят вперед, прыгают, пикают (резко открываются на определенную позицию) очень широко и т.д. Одним из таких примеров в свое время был игрок под ником KennyS. Однако, в 2015 году Valve выпустили обновление в котором передвижение со снайперской винтовкой стало заметно медленнее. Это сильно изменило игру на про уровне, но философия агрессивного снайпера которую популяризировал KennyS своим примером осталась жить в сердцах людей и по сей день. И я часто вижу как люди бегают со снайперской винтовкой по карте как сумашедшие и стараются красиво "фликнуть" (очень быстро перевести прицел на врага и сразу выстрелить).
Что сделал я
Пока что я реализовал основные механики которые будут составлять кор геймлпей и вот первый день как приступил в лвл-дизайну.
Итак, я хотел что бы игра вынуждала игрока быть быстрым, быстро целиться, фликать, быстро реагировать, где-то играть принудительно агрессивно как это любят многие, а где-то относительно аккуратно, думая и готовясь к каждому выстрелу. В общем все то, что требует и CS от снайпера, только в условиях синглплеера и более низкой сложности, что бы сделать подобные ощущения доступными не только людям которые провели в CS пол жизни. Для достижения этой цели я поставил на ботов таймер того, сколько он может видеть игрока вообще и сколько игрок может в бота целиться. Я буду называть цифры которые есть сейчас, которые я поставил под себя, но в будущем они будут меняться в зависимости от выбранного игроком уровня сложности. Итак: если бот видит игрока больше половины секунды - бот стреляет. Если игрок целиться в бота больше 1/10 секунды в режиме зума - бот стреляет. В стандартной ситуации бот никогда не промахивается и по моей задумке должен снимать около половины или 1/3 здоровья. Подобное поведение ИИ вынуждает игрока постоянно быть за укрытием, стараться "начекать" (узнать где находится противник быстрыми стрейфами) врага и потом уже либо выйти со включенным прицелом зная где противник, либо выстрелить моментально зазумившись, либо фликнуть. В общем сделать так, что бы прицел был на противнике меньше 1/10 секунды, а само тело игрока меньше половины секунды в поле зрения бота.
Так же, я добавил в игру некое подобие баннихопа из Counter Strike. Если вкратце, изначально это был баг, при помощи которого можно довольно быстро разогнаться если нажимать кнопку прыжка в тот же момент когда моделька приземляется. Так как комьюнити это дело зашло, появилось название бага - баннихоп и целые турниры по нему, Valve не стали его фиксить и он есть до сих пор и позволяет делать иногда невероятные вещи.
Да, в самом CS это делается очень трудно, так как тайминг нужный для правильного отскока очень мал и по мимо самого отскока надо еще правильно водить мышкой. У меня же в игре все намного проще, тайминг не настолько сложный и никаких движений мышкой делать не надо. Больше того, я даже вывел параметр скорости распрыжки в HUD, что бы игрок всегда знал насколько он хорош. Но, на самом деле этот параметр имеет более важное значение, ибо чем выше скорость игрока - тем меньше здоровья с него снимают боты при стрельбе. На высокой скорости боты вообще перестают попадать. Так же, если игрок просто прыгает на месте и не движется при этом счетчик распрыжки идет, то боты все равно будут попадать, пока игрок не начнет двигаться. В будущем я придумаю что-то по интереснее, но пока что фон чисел отображающих распрыжку становится зеленым когда игрок менее уязвим и серым, когда игрок стоит на месте и боты будут стрелять по нему в полную силу.
В будущем я еще хочу сделать так, что бы во время даже обычного прыжка таймер выстрела ботов становился выше. На тестах я заметил, что я часто прыгаю даже если знаю где именно бот, я делаю это автоматически, так как при игре с живыми людьми прыжки могут сбить прицел и спасти тебя от смерти. По этому я хочу добавить нечто похождее в игру, что бы награждать игрока не только в случае если он распрыгался, но и если просто стреляет в обычном прыжке.
Так же в игре реализована механика прострелов, за счет чего можно убить нескольких ботов в ряд или даже прострелив их сквозь стену. Не каждая стена будет простреливаемой конечно, но с этой механикой можно хорошо поиграть на этапе лвл дизайна.
По мимо этого я добавил пистолет, нож, обычную и дымовую гранату игроку. Пистолет убивает бота с четырех выстрелов, что в условиях скорости реакции ботов почти бессмысленно, однако пистолет хорошо будет работать с гранатой, так как после неё достаточно выстрелить лишь один раз.
Нож, изначально это была скорее просто дань CS, однако, поиграв с ним я понял, что если он будет убивать с первого удара, то можно распрыгаться до сумасшедшей скорости и резать противников абсолютно безнаказанно, так как они не попадают по игроку.
Ну и дымовая граната, это дань тактической составляющей. Так как боты воспринимают её как стену и начнут обходить, а если бот попал в её радиус действия, то он встанет на месте и не будет стрелять, что позволит игроку его легко убить если он видел где находится враг. Позже я сделаю так, что бы в дым небыло видно вообще.
ИИ ботов
Тут ничего сложного, однако есть пара вещей которые я бы хотел вам рассказать.
Итак, боты будут в основном двух видов: нападающие и обороняющиеся. Любые боты знают где игрок и всегда смотрят в его сторону, что уничтожает любую мысль о стелсе на корню. Нападающий ИИ просто идет к игроку. Обороняющий пока что стоит на месте, но в будущем я заставлю их менять позиции за своим укрытием. Так же боты раз в какое то время кидают световую гранату. Если игрок за укрытием или резко отвернется, то она его не тронет, но это заставляет быть более бдительным.
У меня была проблема с нападающими ботами, так как они ходили по одному маршруту и это выглядело плохо, и я это решил для себя не стандартным путем, не знаю на сколько подобный прием распространен, но я такого не видел, возможно, так не делают по причинам которых я еще не понял, хотя предполагаю, что тут могут быть проблемы с производительностью, а возможно все так давно делают и это я в танке. Сейчас будет техническая минутка Unity, по этому если вы на другом движке или вам это не интересно, то можете листать до следующего раздела :)
Боты передвигаются благодаря встроенному в юнити поиску пути при помощи NavMesh. Однако, я сразу оговорюсь, я не использую встроенные агенты, ибо уже изрядно с ними намучался, они то встанут, то телепортнуться куда-нибудь, поворачиваются не так как хотелось бы, приходится вешать костыль на костыле что бы заставить их работать корректно. По этому я просто использую поиск пути, а передвигаю объект уже сам как хочу, начиная с простейшего MoveTowards, заканчивая CharacterController или Rigidbody. Если что, вот ссылка на документацию голого расчета пути:
Так вот, как я говорил выше, дымовые гранаты работают для ботов как препятствие, если говорить конкретно, на дымовой гранате висит NavMeshObstacle, в результате чего она меняет сетку NavMesh и ботам надо её обходить. Это навело меня на мысль, что таким же образом можно заставить ботов периодически менять свой путь, что бы они не ходили по прямой. Я создал объект который назвал Bliking Obstacle. Суть его до ужаса проста - раз в рандомное время он включает и выключает NavMeshObstacle, что меняет сетку и заставляет ботов менять маршрут. На случай случайностей по триггеру проверятся, есть ли бот в зоне препятствия или нет и если есть, то препятствие не включается, что бы боты просто так не останавливались, ибо именно это они делают когда нав меш не может просчитать путь. Таким образом боты перестали ходить по одному и тому же пути и теперь выглядят более живыми. Я понимаю, что это может влиять на производительность, но мои тесты пока больших проблем не выявили и я думаю, если не злоупотреблять подобными "мигающими препятствиями", то ничего страшного и не случится.
Режимы игры
Я выделил основные четыре режима игры на которых будет строится прохождение:
- Нападение
- Оборона
- Платформинг
- Гонка (тот же платформинг, только на время)
Нападение:
Режим напоминающий префаер карты из Counter Strike. Враги стоят на месте или показываются и прячутся за укрытием. Мы помним, в этой игре у ботов высокая скорость реакции, в связи с чем убивать такого врага надо точно зная где он либо выходя из за стены с точно наведенным на него прицелом, либо выходя на шару и убивая его эффектным фликом. Ну или в прыжке, или фаст зумом.
Так же тут вступает в игру геометрии уровня. Довольно важно будет выходить из за стены ровно на столько, на сколько нужно что бы устранить одну цель. Ибо если открыться шире, то пока ты убиваешь одного, тебя уже увидит бот с другой позиции.
Оборона:
Теперь уже игрок стоит на месте, а боты идут на него. Боты могут идти с разных сторон, по этому игроку нужно грамотно использовать данные ему стены и геометрию что бы прячась от одной стороны убивать вторую и наоборот.
Помним, что у нас по мимо стандартной стрельбы есть прострелы сквозь стены и самих ботов, есть пистолет и гранаты. По этому очень многое будет зависеть от дизайна уровней, но большого недостатка в идеях и сочетаниях всех этих механик я не ощущаю.
Платформинг и гонка:
Тут больше предполагается использование механики баннихопа (распрыжки), что бы достигать высоких скоростей и прыгать, прыгать, прыгать и еще раз прыгать. На время, когда что-то рушится, взрывается или для своего удовольствия. Самое главное прыгать, разгоняться до бешенных скоростей и получать наслаждение от скорости.
Первую половину игры конечно все эти режимы должны быть по отдельности. Но потом, конечно же, я начну смешивать одно с другим, что бы вынуждать игрока стрелять на большой скорости в полете, постоянно прыгать и в целом играть как можно более динамично. Собственно, играть так, как это и стараются делать многие в CS :)
Я знаю что проект немного экспериментальный, я стараюсь идти за теми ощущениями от игры которые нравятся мне. Но именно таких проектов я не видел, по этому если вам есть что сказать, я был бы очень рад услышать ваше мнение. На этом у меня все, спасибо огромное что читаете эти строки :)
Еще раз всем больше спасибо и удачи!