25 января 2015 25.01.15 36 6060

Моя артиллерия стреляет добротой, котами и радугой

+27

Привет Stopgame! Возможно, некоторые из вас знают меня по таким хитам как «Симулятор Симулятора» и «Симулятор упоротой лисы». А если не знаете, то это только к лучшему.

Мне 20 лет, я бородат программист, и я делаю игры. Недавно мы с моим знакомым 3D-моделлером делали игру про танки. Это было ужасно. Все ездят, стреляют друг в друга! А ведь в танках наверняка сидят живые люди! В конце концов, моя пацифистская сущность не выдержала и сказала «ДОКОЛЕ». Теперь мы в срочном порядке меняем концепцию игры и начали мы с артиллерии! Make Love, Not War!

 

Ладно, шутки шутками, но мы с вами все-таки находимся в блоге с гордым названием GameDev. Если вы пришли сюда только за котами с радужкой между задних лап, то можете смело переходить к комментам. Если же вам интересны такие фразочки как «тестирование», “разработка”, «углы наводки», «стрельба с упреждением» то велкам под спойлер.

Как я уже сказал, игра у нас про танки. Называется она Tank Exist. Не спрашивайте меня, что значит это название, я сам не знаю.

Однако помимо танков присутствует и другая техника, например вертолеты и турели. В один момент мне очень уж захотелось, чтобы в проекте была стационарная артиллерия, которая будет стрелять по игроку. Не вопрос! Пишем 3D-моделлеру жалобное письмо в духе «ну сделай арту, ну пожалуйста», и через некоторое время получаем результат:

3Dmax у меня кстати лицензионный. Шучу, нет.

Для разработки игры я использую Unity Engine. Я просто процитирую одного умного человека с хабра — «Это замечательный движок, на котором действительно быстро и легко можно сделать очень плохую игру, в которую, в здравом уме, никто и никогда не будет играть. Чтобы создать хорошую игру, все же придется перелопатить документацию, вникнуть в некоторые особенности и набраться опыта разработки»

Ладно, в общем, хватаем за шкирку модельку, и пихнаем ее в Unity. После некоторых размышлений было решено сделать платформу в два раза шире.

Однако толку от такой артиллерии не сильно много, она не умеет вращать башней и не умеет стрелять. Но ведь ЯЖПРОГРАММИСТ.

Для начала научим артиллерию стрелять. В Unity cделать это проще простого, берем модель снаряда, прикручиваем к ней систему частиц для следа и физический компонент под названием Rigidbody для того что бы на снаряд действовала гравитация. В нужный момент времени создаем этот снаряд возле ствола, и придаем ему импульс. Все остальное возьмет на себя физический движок Unity.

Теперь научим артиллерию не просто стрелять, а самостоятельно наводиться и попадать в цель.

В горизонтальной плоскости по задумке башня может поворачиваться на все 360 градусов. Теперь сделаем, чтобы башня поворачивалась в сторону игрока. Сделать это несложно. Просто мысленно делим пространство на две части относительно ствола. Если танк игрока находится в синей части, поворачиваем башню направо, если в зеленой части – налево.

А теперь мы разберемся с вертикальной наводкой, здесь все гораздо интереснее. По задумке угол должен меняться от -10 до 45 градусов. Если вы не прогуливали уроки физики в школе, то наверняка знаете, что именно при угле в 45 градусов достигается максимальная дальность «броска». То есть в нашем случае, чем больше угол – тем дальше летит снаряд. Теперь нам нужно, что бы артиллерия рассчитывала расстояние до игрока, и на основе этого выставляла нужный угол наводки ствола. И если расчет расстояния от артиллерии до игрока делается одной строчкой кода, то для того что бы из этого расстояния получить нужный угол пришлось слегка извратиться. Дело в том, что я из тех людей, которые прогуливали пары физики и матана в универе, и поэтому решил даже не пытаться выводить формулу для определения угла из расстояния.

Я поступил по-другому. Я написал немного кода для того что бы артиллерия отстреляла снаряды с интервалом в один градус, и записала в текстовый файл дальность и длительность полета снаряда для каждого угла. Получилась табличка формата {угол, дальность, время полета снаряда}

Как это выглядит в графическом виде можно видеть на графиках ниже. Красная линия – зависимость дальности полета снаряда от угла наводки. Зеленая линия – зависимость времени полета снаряда от угла наводки. (Картинка кликабельна)

Теперь просто учим артиллерию пользоваться этой табличкой и дело готово! Например, до игрока 60 метров, то арта смотрит по таблице, и видит что при угле 6 гр. дальность 62.93м, а при угле 5 гр. 59.07. Считаем так – 5 + ((60 — 59.07)/( 62.93 — 59.07)) = 5.24 – это угол на который нужно навестись артиллерии. Называется это умной фразой «линейная интерполяция». Конечно, такой способ является упрощенным, однако его точности хватает.

Замечательно, артиллерия умеет стрелять, и даже попадает по танку игрока!

Но. Но танк движется, а до другого края карты снаряд летит 6 секунд. И пока этот снаряд долетит, танк игрока будет очень далеко. Значит нужно научить артиллерию стрелять с упреждением.

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

Например если известно что при текущем расстоянии снаряд будет лететь до игрока 2 секунды, ситуация будет выглядеть следующим образом. Кстати это называется «экстраполяция» и широко применяется в онлайн-играх для предсказания координат игрока при высоком пинге.

На скриншоте ниже видно, что артиллерия целится вовсе не в игрока, а в точку, куда этот самый игрок едет.

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

Да, кстати, я сюда ведь не просто так зашел, а нагло пиариться, ага. В общем если вам вдруг внезапно захотелось следить за новостями проекта, вот вам — http://vk.com/tankexist


Лучшие комментарии

Потому что полтора года назад мы со знакомым захотели научиться делать игры, и для начала решили сделать что нибудь в духе «танчики как на денди кароч») а потом нам захотелось добавить чуууууть-чуть фич) Тем более у нас душа всегда лежала именно к технике, а не к эльфам или про что там еще игры делают.

Результат? Игра про лису принесла мне за полгода два бакса с рекламы, не думаю что тут будет намного больше с моими навыками «продвижения») Зато у меня есть теперь много опыта, и что показать будущему работодателю при приеме на работу.

И в конце концов — делать игры это весело! Это просто нереально круто, когда «мертвая» артиллерия, танк, или еще что-то вдруг начинают двигаться, стрелять, взаимодействовать с окружающим миром. Да и вообще понимание что это ты, ты сделал этот маленький мир со всеми этими правилами, ты вдохнул в него жизнь. Пожалуй это можно понять только лично приняв участие в процессе)
Твори ПК по всей земле
Мне 20 лет, я бородат программист, и я делаю игры.

Здравствуйте, мне 18, я бородат учусь на программиста, и все игры которые я сделал были консольными программками, написанными в школе. Но глядя на гринлайт (особенно на игру 15 летнего чувака) я думаю зачем я вообще учу основы программирования, принципы работы ленты Тьюринга, хранение информации и т.п., если можно слепить из дефолтных моделек человечков, дать им стандартные анимации, придумать фишку игры и продавать? Если я соберусь в ближайшее время делать игрушки, то скорее всего это будет из за спортивного интереса, а не ради наживы.
Теперь по теме:
Получилась табличка формата {угол, дальность, время полета снаряда}

Хитрец)
Значит нужно научить артиллерию стрелять с упреждением.

Чувак, это просто ОФИГЕННО.
Люблю слово программист, в него входит любой человек, который хоть как-то работает с компом, что дает нам огромный разброс реальных профессий. И под консольными играми я подразумеваю игры в командной строке, а не то что вы могли подумать
Дружище, вот тебе скриншот моего ЛЕВОГО монитора. В правой колонке можно видеть список *.cs файлов проекта. Все правда не влезли по высоте, бывает. Правее немного унылого кода. Все это дело крутится на системе контроля версий.

Что мне еще нужно сделать что бы я мог называть себя программистом? Может снова начать писать рогалики в консольке?

Нет, нет, и еще раз нет! Наша целевая аудитория девочки от 11 до 45 лет, им такое не понравится!
Довольно интересная манера подачи инфы о своем проекте, без обид но больше смахивает на гайд по программированию (что не удивительно т.к. программист будет рассказывать о кодировке, дизайнер о виз. стиле) Обычно рассказывают о механике (или как это называется) игры, её целях, так сказать в чем смысл сего действа.
еще две трети того что дают в универе действительно не понадобится

скажи это моей сессии может она отстанет?
Мля, да она ведь не такая страшная. Там хотя бы примерно понятно, что за что отвечает и еще 300 строк кода сверху, а снизу одному Exlain'y известно)
На скринах, на самом деле, довольно рутинный код.
Ну вообще я старался составить статью из двух частей, юмористической, с котом, для тех кому мало интересны всякие гайды. И собственно сам гайд, который я предусмотрительно спрятал под спойлер, и отсутствие которого было бы странным для поста опубликованном в разделе Gamedev. Да и сам гайд я пытался писать обычным, понятным даже 13-летнему ребенку языком. Я даже ни одной строчки кода не привел, так что это явно не гайд по программированию) Скорее это очень упрощенный рассказ о том как работает юнит в игре, для тех кто далек от программирования, но кому было бы интересно прочитать про подобные вещи.

Рассказывать конкретно о проекте не вижу пока смысла, все равно он еще не готов. Когда выйдем на стадию бета-теста, и понадобится много людей чтобы проверить мультиплеер, тогда и расскажу подробно)
Любите котов с радужкой, или рассказы о том как делаются игры?)
fixed в левой колонке список *.cs файлов проекта
Не, все нормально. Просто я перемещаюсь по синусоиде между консерватизмом и либерализмом. И сейчас я думал: о господи, упрощение программ сыграет с нами злую шутка и все юзеры станут тупыми, как следствие станет меньше программистов, забудутся основы и нас ждет крах как первую империю, нужно срочно заставлять всех учить программирование на нижних языках. На самом деле ты крут, все таки у меня и такого пока нет.
под первой империей я подразумеваю Империю из книг Азимова
На самом деле после года работы могу сказать что принципы работы ленты Тьюринга и еще две трети того что дают в универе действительно не понадобится) Понадобятся ООП, базы данных, паттерны проектирования, и умение быстро усваивать новую информацию.
Ну, вы же понимаете, что чем больше вы разбираетесь в программировании, тем проще вам будет делать игру. Вот я абсолютно незнаком с паттернами проектирования (а если знаком, то могу не знать, что это, собственно, паттерн проектирования, так было с пулами), и подозреваю, что если был бы знаком, то мой, простите, быдлокод выглядел бы куда лучше, и, к примеру, реализация навыков была бы не через задницу.
И если передумаешь идти на программиста, иди на физика. Мы с тобой будем бои роботов устраивать.
Читай также