Разработка игр (геймдев) — это производство видеоигры от идеи до выпуска и поддержки: проектирование правил, программирование, создание графики и звука, тестирование и публикация на платформах. Коммерческие игры делают командами по этапам — концепт, препродакшн, производство, альфа и бета, релиз, поддержка, — а технической основой почти всегда служит игровой движок.
Содержание
Ниже — как этот процесс устроен в студиях: что происходит на каждом этапе и какой артефакт он дает, кто за что отвечает, что берет на себя движок и как выглядит «сердце» любой игры — игровой цикл, с проверяемым примером кода.
Три слова, которые путают
- Движок (Unity, Unreal Engine, Godot) — готовая среда с редактором, рендером, физикой, звуком и сборкой под платформы. Команда в основном пишет логику своей игры, хотя крупные студии нередко дорабатывают и сам движок.
- Фреймворк или библиотека (pygame, MonoGame, SDL) — набор функций для окна, графики и ввода. Редактора сцен и сборки «из коробки» обычно нет, архитектуру пишут сами.
- Конструктор — движок с упором на визуальную сборку без кода. Граница с «настоящим» движком размыта: у Unity есть Visual Scripting, у Unreal — Blueprints.
Еще одна пара: механика — правило, по которому игрок взаимодействует с миром (прыжок, стрельба, прокачка), а физика — то, как объекты мира движутся и сталкиваются. Прыжок как механику придумывает геймдизайнер, а высоту и траекторию прыжка считает физика.
Этапы разработки игры: от концепта до поддержки
Этапы ниже — общепринятая модель, но упрощенная: студии называют их по-разному, а итерации (прототип -> тест -> переделка) идут внутри каждого этапа, а не строго по очереди.
| Этап | Главный вопрос | Артефакт на выходе | Кто ведет |
|---|---|---|---|
| Концепт | Что за игра и кому она нужна | Концепт-документ, питч, референсы | Геймдизайнер, продюсер |
| Препродакшн | Будет ли интересно и реализуемо | Прототип, диздок, вертикальный срез, план | Вся ядро-команда |
| Производство | Как сделать весь контент | Уровни, модели, код, звук | Все отделы |
| Альфа | Все ли механики на месте | Сборка со всеми функциями | Продюсер, QA |
| Бета | Готов ли контент и стабильна ли игра | Сборка со всем контентом, исправление ошибок | QA, программисты |
| Релиз | Пройдет ли проверку платформы | Финальная сборка (gold), страница в магазине | Продюсер, издатель |
| Поддержка | Как удержать игроков | Патчи, обновления, события | Live-команда |
Концепт. Формулируют идею одной-двумя фразами, жанр, целевую аудиторию, платформы и референсы — существующие игры, на которые ориентируются. Если игру делают с издателем, здесь готовят питч: зачем рынку этот проект и сколько он будет стоить.
Препродакшн — самый дешевый момент, чтобы ошибиться. Делают прототип — грубую играбельную версию одной механики — и проверяют, интересно ли в это играть. Пишут диздок (GDD): механики, баланс, уровни, интерфейс. Выбирают движок и технологии. Итог этапа — вертикальный срез: маленький кусок игры в финальном качестве, по которому оценивают объем работ и сроки.
Производство — самый долгий этап. Программисты пишут системы, художники делают модели и анимации, левел-дизайнеры собирают уровни, звукорежиссеры — звук. Работу обычно ведут итерациями (спринтами) с регулярными внутренними сборками.
Альфа и бета. Точных стандартов нет, но распространенное деление такое: к альфе в игре есть все механики (часть графики может быть временной), к бете — весь контент, и команда в основном чинит ошибки и оптимизирует. Открытые и закрытые бета-тесты с игроками проверяют баланс и нагрузку на серверы.
Релиз. Финальная сборка проходит проверку платформы: у консолей это обязательная сертификация по техническим требованиям производителя, у магазинов — модерация. Параллельно готовят страницу игры, трейлер, рейтинг возрастной категории.
Поддержка после релиза — патчи, исправления, новый контент. Для онлайн-игр это отдельный процесс (live ops), который может длиться годами дольше самой разработки.
Кто делает игры: роли в команде
Состав зависит от масштаба: в инди-команде из трех человек каждый совмещает несколько ролей, в крупной студии одна роль — целый отдел.
| Роль | Чем занимается | Когда больше всего работы |
|---|---|---|
| Продюсер | Сроки, бюджет, приоритеты, связь с издателем | Весь цикл; пики — питч, план производства, релиз |
| Геймдизайнер | Правила, механики, баланс, диздок | Концепт и препродакшн, затем баланс на бете |
| Левел-дизайнер | Уровни: маршрут игрока, темп, сложность | Вертикальный срез и производство |
| Программист | Геймплей, интерфейс, сеть, инструменты, оптимизация | Прототип, производство, оптимизация перед релизом |
| Художник | Концепты, 2D, 3D-модели, текстуры, анимация, эффекты | Концепт-арт в начале, основной объем — производство |
| Технический художник | Связь арта и кода: шейдеры, пайплайн ассетов | Препродакшн (пайплайн) и оптимизация графики |
| Звукорежиссер | Музыка, эффекты, озвучка | Вторая половина производства |
| Тестировщик (QA) | Поиск ошибок, проверка по требованиям платформ | Альфа, бета, подготовка к сертификации |
Программисты тоже делятся: геймплейные пишут поведение персонажей и правила, движковые — рендер и производительность, сетевые — мультиплеер, инструментальные — утилиты для художников и дизайнеров.
Зачем нужен движок и какой выбирают
Движок снимает с команды типовые задачи: отрисовку, физику, звук, ввод, загрузку ресурсов и сборку под разные платформы. Крупные студии нередко используют собственные движки, заточенные под свои жанры, но большинство команд берет готовый.
| Задача проекта | Что обычно берут | Язык логики | Когда иначе |
|---|---|---|---|
| Мобильная или кроссплатформенная 2D/3D-игра | Unity 6 | C#, Visual Scripting | Нужна топовая 3D-картинка — Unreal |
| 3D с упором на реалистичную графику | Unreal Engine 5 | C++, Blueprints | Маленькая команда и 2D — Unity или Godot |
| Небольшая 2D-игра, открытый код | Godot 4 | GDScript, C# | Нужны консоли и готовые сервисы — Unity |
| Быстрый 2D-проект с простым кодом | GameMaker | GML | Серьезное 3D — другой движок |
Выбор движка определяет и язык: для Unity нужен C#, для Unreal — C++ или Blueprints. Условия лицензий меняются (у Unreal роялти после определенного дохода, у Unity — порог бесплатной версии), поэтому их сверяют с официальной страницей перед стартом коммерческого проекта.
Как игра работает внутри: игровой цикл
Какой бы движок ни был, в основе игры — игровой цикл: много раз в секунду программа читает ввод, обновляет состояние мира и рисует кадр. Движок крутит этот цикл за разработчика, но понимать его нужно, иначе появляются ошибки, которые зависят от частоты кадров.
Начнем с наивного варианта: логику двигают на время последнего кадра. Пример ниже считает высоту прыжка при разном FPS (проверено на Python 3.14.7).
GRAVITY = -30.0 # м/с^2, "игровая" гравитация
JUMP_SPEED = 12.0 # начальная скорость прыжка, м/с
def jump_peak(dt):
"""Прыжок с земли: вернуть максимальную высоту при шаге dt."""
y, vy, peak = 0.0, JUMP_SPEED, 0.0
while True:
vy += GRAVITY * dt # сначала скорость
y += vy * dt # потом позиция (полунеявный Эйлер)
if y <= 0.0: # коснулись земли - прыжок окончен
return peak
peak = max(peak, y)
for fps in (30, 60, 144):
print(f"{fps:>3} FPS: пик прыжка {jump_peak(1 / fps):.3f} м")
Результат прогона:
30 FPS: пик прыжка 2.200 м
60 FPS: пик прыжка 2.300 м
144 FPS: пик прыжка 2.359 м
Одна и та же игра дает разную высоту прыжка на разных компьютерах: на мощном ПК персонаж допрыгнет до платформы, на слабом — нет. Причина — численное интегрирование с разным шагом.
Исправление, которое применяют движки, — фиксированный шаг логики: отрисовка идет с любой частотой, а физика и правила шагают на одинаковый интервал, в примере ниже — 1/60 секунды. Накопленное время «догоняют» нужным числом шагов.
FIXED_DT = 1 / 60 # логика всегда шагает на 1/60 секунды
GRAVITY, JUMP_SPEED = -30.0, 12.0
class Player:
def __init__(self):
self.y, self.vy, self.on_ground, self.peak = 0.0, 0.0, True, 0.0
self.jump_requested = False # буфер ввода
def update(self, dt):
if self.jump_requested and self.on_ground: # прыгать можно только с земли
self.vy, self.on_ground = JUMP_SPEED, False
self.jump_requested = False # нажатие обработано
if not self.on_ground:
self.vy += GRAVITY * dt
self.y += self.vy * dt
if self.y <= 0.0: # приземление
self.y, self.vy, self.on_ground = 0.0, 0.0, True
self.peak = max(self.peak, self.y)
def run(fps, seconds=1):
player, acc, steps = Player(), 0.0, 0
for frame in range(fps * seconds):
if frame == 0: # 1. ввод: игрок нажал прыжок
player.jump_requested = True
acc += 1 / fps # сколько реального времени прошло
while acc >= FIXED_DT: # 2. логика фиксированными шагами
player.update(FIXED_DT)
acc -= FIXED_DT
steps += 1
# 3. здесь движок рисовал бы кадр (render)
return player.peak, steps
for fps in (30, 60, 144):
peak, steps = run(fps)
print(f"{fps:>3} FPS: пик {peak:.3f} м, шагов логики {steps}")
Результат прогона:
30 FPS: пик 2.300 м, шагов логики 60
60 FPS: пик 2.300 м, шагов логики 60
144 FPS: пик 2.300 м, шагов логики 59
Высота прыжка теперь одинакова при любом FPS. 59 шагов при 144 FPS — не ошибка: из-за округления дробей последний шаг еще не набрался и перейдет в следующий кадр.
Обратите внимание на буфер ввода jump_requested. Если передавать нажатие в логику только в том кадре, где его прочитали, при 144 FPS оно теряется: в первом кадре накапливается меньше 1/60 секунды, шаг логики не выполняется, и такой вариант кода в нашем прогоне дал пик 0.000 м. Буфер хранит нажатие до ближайшего шага логики.
В Unity эту же идею отражает пара методов Update (каждый кадр) и FixedUpdate (фиксированный шаг физики, по умолчанию 0,02 секунды, то есть 50 раз в секунду), в Godot — _process и _physics_process (по умолчанию 60 тиков в секунду). Интервал настраивается в проекте. Проблема потерянного нажатия там та же: ввод читают в Update, а в FixedUpdate передают через флаг, как в примере. Пример упрощен: реальные движки еще ограничивают число шагов за кадр и интерполируют отрисовку между шагами.
Почему игры срываются по срокам
- Раздувание объема. Новые функции добавляют на производстве, когда их дешевле было проверить в препродакшне.
- Пропущенный прототип. Механику впервые пробуют уже в дорогом контенте, и переделка стоит месяцев.
- Поздние тесты производительности. Игра, которая идет на ПК разработчика, может не влезть в память консоли или телефона.
- Требования платформ в последний момент. Сертификацию и правила магазина проверяют заранее, а не за неделю до релиза.
Выводы
- Разработка игр в студии идет по этапам: концепт, препродакшн, производство, альфа, бета, релиз, поддержка; у каждого этапа свой артефакт.
- Главные решения — интересна ли механика и реализуем ли объем — принимают в препродакшне через прототип и вертикальный срез.
- Команда делится на дизайн, программирование, арт, звук, QA и производство; в инди-проектах роли совмещают.
- Движок берет на себя рендер, физику, звук и сборку; выбор движка задает язык — C# для Unity, C++ или Blueprints для Unreal, GDScript для Godot.
- Игровой цикл «ввод -> логика -> отрисовка» с фиксированным шагом логики делает поведение игры одинаковым при любом FPS.
Где применяется / связь с практикой
Освойте тему на практике
Все этапы начинаются с геймдизайна: правила, механики, баланс и диздок определяют, что будут делать программисты и художники. Если хочется разобраться, как придумывать и описывать игры так, чтобы команда могла их собрать, этому посвящен курс «Геймдизайн и левел-дизайн». Посмотреть формат занятий и задать вопросы преподавателям можно на открытых уроках Otus.
Если нужен пошаговый путь для одиночной разработки своей первой игры, он разобран отдельно в статье план создания собственной игры.
FAQ
Сколько времени занимает разработка игры?
От нескольких недель для небольшого инди-проекта до нескольких лет для крупной студийной игры. Срок определяют объем контента и размер команды, а не жанр сам по себе.
Можно ли сделать игру одному?
Да, многие известные инди-игры сделаны одним-двумя людьми. Но соло-разработчик проходит те же этапы и совмещает роли, поэтому объем проекта приходится сильно ограничивать.
Обязательно ли программисту в геймдеве знать математику?
Для геймплея хватает школьной алгебры и векторов. Глубже математика нужна движковым программистам: рендер, физика, оптимизация.



