Приветствую!
Хочу поделиться своим знакомством с геймдевом. Рассказать о том, как я начал свой путь с XNA. Так же хотелось бы рассказать, как я стал программистом, жаждущим большего контроля над компьютером и том, как влип в написание своего движка на C++. Расскажу о познании готовых решений, таких, как Unity3D и покажуь на своих примерах, что из этого можно сделать.
Предисловие
Однажды на моей первой работе (программистом) мой непосредственный начальник спросил, писал ли я когда нибудь игры. Первое и последнее (до этого момента) мое знакомство с игроделом было за двадцать лет до этого на ZX Spectrum на Basic. Никакой документации, никакого интернета и Хабра. Элементарные знания в программировании — и все. В общем, игры я не делал. Начальник задал еще один уточняющий вопрос: можно ли написать игру на C#? Я было начал смеяться, но он кинул ссылку на форум, в котором упоминался XNA.
XNA/C#
XNA для меня стал хорошим началом. Я уже достаточно хорошо чувствовал себя программируя на C#. Также быстро нашел сообщества по этой технологии. Как оказалось, XNA разрабатывалось MS специально для изучения работы с 3D графикой. По сути XNA является оберткой на DirectX.
В любой книге по XNA описаны основные принципы построения игры. Такие понятия, как жизненный цикл игры, который происходит каждый кадр в игре и обновляет статусы объектов и рендерит готовый кадр, камера, проекции, передача вершин в видео карту и отображение 3D объектов в пространстве и другое. Понимать на низком уровне как устроена игра вам все равно придется, даже если вы используете готовые движки, такие как Unity3D.
Так и начал изучать и вникать. По ходу дела пришлось вспомнить тригонометрию и немного математики, в частности, по матрицам. На этом школьная программа не закончилась. Есть такое понятие, как шейдеры, грубо говоря, код, который выполняется на видео карте. В них, как правило, проводятся расчеты над позицией и цветом пикселей. Удобное место для расчета отражений, бликов и прочего. Для этого пришлось изучить еще литературу и попутно физику.
Сам я начинал с книги «3D Graphics with XNA Game Studio 4.0» Sean James.
В ней хорошо по порядку разложен материал. Описываются и математические необходимые знания, и по шейдерам.
И вот, когда на экране отобразился наконец твой куб в пространстве, начинаешь задумываться, что делать дальше. Я решил попутно изучению делать игру в жанре towerdefense и в 3D. Этот жанр проще в реализации, а 3D — потому как я не художник и рисовать все объекты под разными углами — это проблема. Собственно, тут и новая задача — изучить 3D редактор. Хорошо подходит и 3DMax или Blender. XNA жует формат fbx и эти редакторы хорошо в него экспортировали модели.
И вот, все приложения и все технологии известны. Все, что нужно для создания игры, готово к эксплуатации. Вооружившись книгами и Гуглом… потерял все свободное время после работы.
Первые результаты стараний:
На видео присутствует модель «чувака», которую позаимствовал из интернета. Но как потом можно убедиться, создавать свои модели с анимацией не сложно и интересно, даже для меня программиста.
Описывать подробно как и чего делал нет необходимости. Много материала в интернете. Да и по видео можно видеть мои шаги. Хотелось бы отметить один момент. Когда вы сами пишите свой движок, свои шейдеры, то нужно на это потратить время, возможно, не малое. Так вот, к примеру, я разбирался, как делать тени. Изучал технику каскадных теней (не пугайтесь такой терминологии, это не так сложно, как звучит).
Сколько я потратил времени, чтобы у меня так ложились тени, я точно не помню. Наверное, месяц или два. На Unity3D для этого вам достаточно будет всего лишь установить пару флажков у объектов на сцене.
Так, мало по малу изучал материал и писал игру. Каждый день, постоянно. Главное в этом деле, когда делаешь один игру, движок, контент и все-все — приучить себя делать это постоянно. В такой ситуации иногда хочется делать все, что угодно, только не игру. Читать разные статьи на тему «как я написал свою первую игру». Это дает время отдохнуть и воодушевиться. Но злоупотребляя такими статьями есть шанс остаться в мечтах, забросив разработку.
Делая свою первую игру, я дошел до момента, когда хотелось бы ее запустить уже на устройстве. Делал я на XNA с надеждой выложить игру под XBOX. В тот момент оказалось, что из России нельзя выкладывать свои игры под эту приставку. Зато я могу выложить ее в маркет под WindowsPhone. Игру я доделал и выложил в маркет. Делал я ее в итоге 10 месяцев. От начала момента, как узнал об XNA, и до релиза в маркете.
Тут стоит отметить один момент. Выложить игру в маркет — это та еще история. Маркетинг, продвижение. Это на целую статью и в двух словах тут не обойтись.
Все вроде чудесно, качество контента в моей игре как раз на телефон (ну не художник я). Но на телефон XNA имеет ограничения, в разрешении экрана нельзя использовать свои собственные шейдеры. А что нужно, чтобы не было никаких ограничений? Нужно использовать нативный язык под эту ОС. Для этих целей отлично подойдет язык C++, а для графики — DirectX.
DX11/C++
Вот я и решил почувствовать полную свободу, никаких ограничений под платформу. Любые шейдеры, которые только захочу и смогу написать, любая логика. Это очень подкупало, но я осознавал, сколько потрачу времени на изучение очередного языка. Это немного и отпугивало, к тому же я уже познакомился с Unity3D и мог оценить, насколько с ним все было бы проще. Я это вполне мог уже оценить после написания своего первого движка на XNA. А тут и еще ниже уровнем, и язык, и работа с графикой.
Некоторое время поколебавшись, я то начинал делать на C++, то на Unity, но потом понял, что я все равно буду мучиться и хотеть полной свободы. Решился.
В принципе, я уже был знаком с основами и с необходимыми знаниями математики и физики, плюс был опыт написания шейдеров. Что мне нужно было изучить — это сам язык C++ (в особенности работа с ссылками) и DirectX. К счастью, есть хорошая книга по этому всему: «Introduction to 3D Game Programming with Direct3D 11.0» Frank Luna.
Вооружившись книгой, Гуглом и настойчивостью, я начал делать игру. Делать эту игру оказалось эмоционально похоже на первую. Начинал с большим энтузиазмом, но походу дела появлялись мысли забросить, отдохнуть. Самым сложным для меня было делать модели. Я их просто не мог придумать. Однако, сделать саму модель даже живого персонажа и нацепить на него скелетную анимацию — это очень даже и не сложно:
Психологически сложный момент, когда дописан движок и вся логика игры, осталось вроде сладкое, сделать модели и все. Однако это больше всего и раздражало. Хотелось на модель тратить не более дня. Ведь если подсчитать количество уровней в игре (уникальных желательно), количество объектов, «врагов» и прочего, можно на полгода уйти в моделинг. Меня это не устраивало и хотелось поскорее завершить проект. Что и отражается на моих играх. Катастрофически не хватало художника.
Как и в первый раз, с мыслями «я больше никогда не буду делать игры», завершил и этот проект. Скажу сразу, модели могли быть и лучше даже с моими руками, но я вполне рад тому, что у меня получилось.
В итоге игру я делал опять же 10 месяцев. Это с учетом, что знания уже имелись. Очень много времени было потрачено на свой движок. Кусок этой статьи вообще никак не отражает трудозатраты, потраченные на разработку игры. Так, к примеру, на Unity можно за день «набросать» модели на сцену, привязать к ним свои скрипты и даже использовать шейдеры — уровень готов. Такими темпами я мог бы эту же игру с этими моделями сделать месяца за три (по очень скромным меркам). При этом игра была бы не только под WP, но и как минимум под Android.
Unity3D/C#
Пройдя весь этот путь (делал игры дома после работы, жертвуя отдыхом — и так на протяжении двух лет), мне захотелось сделать игру на готовом движке, какую-нибудь простенькую. Для этого решил сделать игру в жанре «Три в ряд». Жанр вроде проще некуда и для телефона играть удобно, особенно в метро и одной рукой.
Сам движок интуитивно понятный, я бы сказал. Да и сообщество большое, нагуглить можно практически все, для начинающего уж точно. Если делать игру почти как в конструкторе — действительно легко и даже приятно, то с «жанр вроде проще» я не угадал. Но эта сложность относится к коду логики игры.
Так я получил интересующий меня опыт в геймдеве. Писать свои движки нет смысла (на фоне имеющихся), да и нет такой цели и желания. Я теперь понимаю, как устроены игры. Писать свои игры для меня так и остается хобби. А при наличии таких движков писать их уже почти и не надо. Элементарные скрипты — и все. Тени, отражения, пострендеринг, normal mapping и прочее становятся просто «галочками». Можно спокойно делать основной упор на контент.
Эпилог
Для себя сделал пару выводов:
Если вам интересно досконально понимать как это все устроено и работает, есть желание общаться на более низком уровне к ОС, то можно начать с XNA или подобных средств на других платформах.
Если вы нацелены на заработок, у вас есть команда (художники как минимум) или вы хотите не вдаваясь в подробности «написать по-быстрому» свою игру, тогда лучше начинать с готовых движков.
Автор: ZeLDER