Разработка игр: как создаются игры — этапы, роли и движки

Разработка игр: как создаются игры - этапы, роли и движки Полезное

Разработка игр (геймдев) — это производство видеоигры от идеи до выпуска и поддержки: проектирование правил, программирование, создание графики и звука, тестирование и публикация на платформах. Коммерческие игры делают командами по этапам — концепт, препродакшн, производство, альфа и бета, релиз, поддержка, — а технической основой почти всегда служит игровой движок.

Ниже — как этот процесс устроен в студиях: что происходит на каждом этапе и какой артефакт он дает, кто за что отвечает, что берет на себя движок и как выглядит «сердце» любой игры — игровой цикл, с проверяемым примером кода.

Три слова, которые путают

  • Движок (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

Сколько времени занимает разработка игры?
От нескольких недель для небольшого инди-проекта до нескольких лет для крупной студийной игры. Срок определяют объем контента и размер команды, а не жанр сам по себе.

Можно ли сделать игру одному?
Да, многие известные инди-игры сделаны одним-двумя людьми. Но соло-разработчик проходит те же этапы и совмещает роли, поэтому объем проекта приходится сильно ограничивать.

Обязательно ли программисту в геймдеве знать математику?
Для геймплея хватает школьной алгебры и векторов. Глубже математика нужна движковым программистам: рендер, физика, оптимизация.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)