Как программировать игры: полное руководство для новичков
Чтобы программировать игру, выберите игровой движок, выучите язык, на котором он работает, и пишите скрипты, которые к нему обращаются, — целую игру почти никогда не пишут с нуля. Программирование игры — это не один универсальный навык: это применение языка вроде C#, C++, GDScript или GML к API конкретного движка, который уже берёт на себя отрисовку, ввод, звук и игровой цикл. В руководстве — что на деле означает «программировать игру», на каком языке работает каждый из ведущих движков (Unity, Godot, Unreal, GameMaker, MonoGame, веб), сколько кода действительно требуется для первой игры, практический путь к готовой игре, ошибки, на которых спотыкаются новички, и когда код можно вообще не писать, используя визуальный инструмент.
Чтобы программировать игру, выберите игровой движок, выучите язык, на котором он работает, и пишите скрипты, которые к нему обращаются. Целую игру почти никогда не пишут с нуля. Современный движок уже берёт на себя всё, что нужно каждой игре, — вывод изображения на экран, чтение ввода, воспроизведение звука и центральный цикл, — а ваш код — это слой правил, поведения и контента, который превращает эту машину в вашу игру. Поэтому программирование игры — это не один универсальный навык, а применение языка вроде C#, C++, GDScript или GML к API конкретного движка.
В руководстве — что на деле означает «программировать игру», на каком языке работает каждый из ведущих движков, сколько кода действительно нужно для первой игры, практический путь к её завершению, ошибки, на которых спотыкаются новички, и, честно говоря, когда код можно вообще не писать.
Если вам пока не вполне ясно, что такое движок, начните с простого объяснения, что такое игровой движок; эта статья исходит из того, что движок — слой под вашим кодом — вам уже знаком.
Что на деле означает «программировать игру»
Возьмите универсальный язык сам по себе — на нём можно вычислить что угодно, но вывести спрайт на экран одной строкой не получится. Нужно открыть окно, создать поверхность отрисовки, загрузить файлы изображений в память и запустить цикл, который десятки раз в секунду очищает экран и перерисовывает его. Ни одно из этих действий не относится к вашей игре. Движок существует именно для того, чтобы сделать всё это за вас, и тогда первая же написанная строка может стать настоящим геймплеем.
Когда вы «программируете игру», вы по большей части пишете небольшие функции, которые движок вызывает в определённые моменты. В каждом кадре движок выполняет игровой цикл — читает ввод, обновляет мир, рисует результат, — и ваши скрипты встраиваются в этот цикл. Скрипт движения срабатывает на этапе обновления; команда отрисовки — на этапе вывода. Ваш код описывает, что должно произойти; движок берёт на себя как и когда.
Именно поэтому «научиться программировать игры» на деле означает «выучить язык одного движка и его API». Хорошая новость в том, что основы программирования — переменные, условия, циклы, функции, объекты — переносятся между движками, даже когда язык меняется.
Язык выбирают, выбрав движок
Самое полезное решение — какой движок использовать, потому что он и определяет ваш язык.
| Движок | Язык(и) | Сложность | Для чего подходит |
|---|---|---|---|
| Unity | C# | Средняя | Широкие задачи 2D и 3D, мобильные игры, большая база уроков |
| Godot | GDScript, C#, C++ (GDExtension) | Низкая–Средняя | Инди, 2D, проекты с открытым кодом |
| Unreal Engine | C++, Blueprints (визуально) | Высокая | Реалистичная 3D-графика, визуал уровня AAA |
| GameMaker | GML | Низкая | Игры, целиком посвящённые 2D |
| MonoGame | C# | Средняя | 2D с акцентом на код, полный контроль |
| Веб (Phaser, PixiJS) | JavaScript, TypeScript | Низкая–Средняя | Браузерные игры, мгновенное распространение |
Заметьте, что язык редко удаётся выбрать свободно. Хотите Unity — учитесь C#. Хотите Godot — учитесь GDScript (а C# доступен как вариант в .NET-сборке). Движок выбирают первым, за ним следует язык.
Языки простыми словами
Краткий портрет языков, с которыми вы столкнётесь, примерно в порядке возрастания сложности для новичка.
GDScript — встроенный язык Godot, намеренно сделанный похожим на Python. Это самый мягкий порог входа в этом списке: короткий, опирающийся на отступы, тесно связанный с системой узлов Godot. Если вы начинаете с нуля и хотите быстро двигаться, GDScript — один из лучших вариантов.
C# — язык Unity и MonoGame, а также вариант в .NET-сборке Godot. Современный, читаемый, строго типизированный язык с огромным объёмом обучающих материалов. C# — пожалуй, самый разумный выбор для большинства: он достаточно продуктивен для небольших проектов, достаточно мощен для крупных и при этом остаётся по-настоящему универсальным навыком.
GML (GameMaker Language) — скриптовый язык GameMaker с синтаксисом, напоминающим JavaScript. Он создан специально для 2D-игр и остаётся небольшим и доступным. Если вы твёрдо решили заниматься 2D, GML просто не будет вам мешать.
JavaScript и TypeScript работают в вебе. Для браузерных игр это единственный реалистичный выбор, и преимущество распространения — ссылка без установки — действительно велико. TypeScript добавляет типы к JavaScript и окупается, как только проект разрастается.
C++ — язык Unreal Engine и внутрикорпоративных движков большинства крупных студий. Он даёт наибольший контроль и лучшую производительность для серьёзной 3D-графики, но и осваивается тяжелее всего: памятью вы управляете сами, сообщения об ошибках славятся своей непонятностью, а мелкие промахи приводят к жёстким падениям. C++ стоит осваивать, если вам нужна фотореалистичная 3D-графика или работа в студии; для первой 2D-игры он избыточен.
Сколько кода на самом деле нужно для первой игры
Меньше, чем боятся, но больше нуля. Полноценную играбельную копию Pong или Flappy Bird в Unity или Godot часто можно уложить в несколько сотен строк кода — достаточно мало, чтобы прочитать за один присест, и достаточно много, чтобы освоить цикл. Цифра, которая отпугивает новичков, — это не код самого геймплея, а шаблонная рутина: настройка, конфигурация, возня с тем, чтобы открыть окно и сдвинуть изображение, прежде чем появится что-то похожее на игру. Движки существуют, чтобы сократить эту рутину, а инструменты, идущие дальше, — визуальные скрипты и редакторы без кода, — сокращают её ещё сильнее.
Реалистичная оценка для новичка, занимающегося в свободное время: несколько недель до первой маленькой готовой игры, месяцы, чтобы почувствовать себя уверенно в более крупном проекте, годы до мастерства. Масштаб важнее таланта. Доведут дело до конца те, кто держит первую игру крошечной.
Практический путь к первой игре
- Выберите один движок и придерживайтесь его. Выбирайте под тип проекта: для 2D-игр берите движки, созданные для 2D, а чтобы свести код к минимуму, — визуальные. Сменить движок посреди проекта — один из самых надёжных способов ничего не выпустить.
- Выучите язык ровно настолько, чтобы читать код. Переменные, условия, циклы, функции, базовые объекты. Осваивать язык целиком до начала работы не нужно — остальное вы доучите в процессе.
- Сделайте копию крошечной игры. Pong, тап-игру в духе Flappy, платформер на один экран. Копирование снимает с вас задачу дизайна, и вы сосредотачиваетесь на том, чтобы заставить движок что-то сделать.
- Доведите её до конца. Титульный экран, одно условие победы, одно условие поражения, перезапуск. Завершённая маленькая игра учит большему, чем амбициозная недоделанная.
- Выпустите её. Экспортируйте, выложите куда-нибудь, где можно поиграть, — в браузер, в APK, в исполняемый файл, который вы передадите другу. Шаг экспорта и публикации — это та часть, где вы осваиваете работу с платформами, и именно его чаще всего пропускают новички. Если игра не экспортируется, это отдельная задача со своими решениями.
- Делайте следующую игру. Именно на второй игре по-настоящему накапливается опыт, потому что вы начинаете её, уже зная, как довести дело до конца.
Ошибки, на которых спотыкаются новички
| Ошибка | Чем мешает | Чем заменить |
|---|---|---|
| Смена движка | Каждая смена сбрасывает прогресс; новый всегда кажется сложнее | Выберите один и доведите игру до конца, прежде чем пересматривать выбор |
| Незавершённость | Бесконечный проект учит всему, кроме умения выпускать игры | Сделайте первую игру настолько маленькой, чтобы её закончить |
| Бесконечные туториалы | Смотреть чужие разборы вместо того, чтобы собирать своё | Пройдите один урок, а затем сделайте то, чего в нём не было |
| Слишком амбициозный первый проект | MMO или открытый мир — это годы работы для целой команды | Начните с одной механики и одного экрана |
| Изучение языка без проекта | Синтаксис сам по себе не запоминается | Освойте базу, а остальное доучивайте в деле |
| Пропуск экспорта | Игра, которую запускаете только вы, даёт лишь половину нужного опыта | Экспортируйте и передайте кому-то ещё |
Общее во всех этих случаях одно: доведите до конца что-то маленькое. Почти любая остановка новичка сводится к проекту, который оказался слишком большим или так и не дошёл до состояния «готово».
Когда код не нужен
Программирование — один из способов сделать игру, но не единственный. Второе семейство инструментов позволяет собирать логику визуально — соединяя узлы, связывая события или расставляя блоки — и получать игру, не набирая код. Blueprints в Unreal, визуальные скрипты Godot и специализированные движки без кода вроде Construct, GDevelop и Egmatic работают именно так.
Это не худший путь — просто иной компромисс. Визуальные инструменты быстрее приводят к играбельному прототипу и куда доступнее для того, кто не хочет сначала учить язык, ценой тонкого контроля и, в некоторых движках, производительности на очень крупных проектах. Для 2D-игр визуальный путь часто — лучший выбор для старта.
Если такой компромисс вам подходит, подробнее о стороне без кода рассказывают руководство по визуальным скриптам и обзор визуального редактора игр, а статья о создании 2D-игры без программирования проходит весь процесс.
Роль Egmatic
Egmatic — это IDE и движок для 2D-игр: визуальный редактор для проектирования сцен, расстановки объектов и связывания логики через узлы, без той стены кода, какой требует чистый фреймворк. Вы получаете редактор, модель сцен, предпросмотр в реальном времени и работу с ассетами, а не пустой файл с кодом. Под капотом он работает на MonoGame, поэтому игры, которые он создаёт, компилируются стандартным инструментарием .NET, а при необходимости можно задействовать и C#, — но отправная точка визуальная, и в большинстве 2D-игр не требуется ни одной строки набранного кода.
Это делает Egmatic удачным выбором для одной конкретной и частой ситуации: вы хотите сделать 2D-игру, вам нужен настоящий редактор, а не файл с кодом, и логику вы предпочитаете выражать визуально, а не осваивать для этого язык. Если же вам нужен широчайший набор инструментов для 3D или работа в студийном конвейере, честным ответом будет движок с акцентом на код — Unity или Unreal. Чтобы понять, какое место Egmatic занимает в общей картине, сравните варианты в подборке лучших движков для инди-разработчиков, а сравнение 2D и 3D освещает решение, которое сильнее всего определяет ваш дальнейший путь.
Итог
Программировать игру — значит применять язык к API движка, а не строить всё с нуля. Выберите движок под свой проект, выучите язык, на котором он работает (C# для Unity и MonoGame, GDScript для Godot, GML для GameMaker, C++ для Unreal), и сделайте маленькую игру до конца, прежде чем браться за что-то амбициозное. Доведите её до конца, выпустите и развивайте дальше. А если код вы предпочитаете обойти, визуальный движок вроде Egmatic позволяет сделать 2D-игру без единой строки — пункт назначения тот же, а рутины на пути меньше.