Раздел
Программирование
Как игра работает внутри и как её программируют: с нуля до Blueprints и C++ в Unreal, каркас игры, паттерны, скорость и память.
Как устроена игра
Из чего сделана игра: движок, ассеты, код и данныескороЧто лежит внутри готовой игры: движок, одинаковый для многих игр, и содержимое, которое делает игру своей, — модели, текстуры, звуки, уровни, правила и настройки.Компьютер изнутри: процессор, видеокарта, память и дискскороЧто делает каждая часть компьютера и почему игре важна каждая: процессор считает правила, видеокарта рисует, память держит под рукой, диск хранит. Откуда берутся слова «упирается в процессор» и «не хватает памяти» и почему без этого не понять, отчего игра тормозит.Кадр и тик: как игра живёт во временискороЧто происходит за один кадр, почему всё умножают на время кадра и откуда берутся рывки.Движок: что он делает и какой выбратьскороКакую работу берёт на себя движок — рисует, считает физику, играет звук, читает кнопки — и чем различаются Unreal, Unity, Godot и собственные движки студий. Как выбирать под свою игру и команду.
С нуля
Программа на пальцах: команды по порядкускороЧто такое программа без единой строчки кода: рецепт, который компьютер выполняет буквально, шаг за шагом. Почему компьютер не догадывается, что ты имел в виду, и как разбивать задачу на маленькие шаги.Переменные и типы: коробки с подписямискороГде программа хранит здоровье, имя и координаты: переменная как подписанная коробка, числа целые и дробные, «да» и «нет», текст и векторы — и почему тип важен.Условия и циклы: выбор и повторскороКак программа решает и повторяет: «если здоровье кончилось — проиграть», «для каждого врага — проверить, видит ли он игрока». Условия, сравнения, «и» и «или», циклы и как не зациклиться навсегда.Функции: рецепт с ингредиентамискороКак не писать одно и то же десять раз: функция берёт входы, что-то делает и отдаёт результат. Имя, входы и выход, и почему маленькие функции проще проверять и чинить.Объекты и классы: чертёж и изделияскороКак программа описывает вещи мира: класс — чертёж двери, объекты — сотня дверей на уровне, у каждой свои данные и общие умения. Наследование — общий чертёж и его уточнения.События: игра отвечает на происходящеескороКак игра узнаёт, что что-то случилось: нажали кнопку, пуля попала, игрок вошёл в зону. События и их обработчики и почему проверять каждый кадр хуже, чем ждать события.Отладка: как найти ошибкускороЧто делать, когда игра ведёт себя не так: воспроизвести, сузить, проверить догадку. Точки остановки, вывод значений на экран, пошаговое выполнение и как читать сообщение об ошибке.Списки, словари и множестваскороКак хранить много всего сразу: список врагов, словарь «предмет — количество», множество посещённых мест. Что в каждом из них делается быстро, а что медленно.Почему одно быстро, а другое нет: сложность алгоритмовскороПочему проверка «каждый с каждым» убивает игру при тысяче объектов, а поиск по словарю — нет: как растёт время работы с числом данных и простые способы оценить код до того, как он затормозит.
Blueprints
Blueprints в Unreal: программа из нодскороКак устроен визуальный язык Unreal: события, ноды-действия, провода исполнения и данных, переменные и функции графа. Те же идеи программирования, только мышкой.Первая механика на BlueprintsскороПо шагам: дверь, которая открывается, когда игрок рядом и нажал кнопку, — зона, ввод, плавное открытие по времени, звук и проверка в игре.Как акторы общаются: ссылки, интерфейсы и диспетчерыскороКак кнопка открывает дверь на другом конце уровня: прямые ссылки, приведение типа, интерфейсы и рассылка событий. Что выбрать и почему «всё ссылается на всё» — плохая идея.Blueprints или C++: что где писатьскороГде удобнее Blueprints, а где незаменим C++: скорость работы и скорость правок, читаемость больших графов, работа в команде и как делят проект между двумя языками.
C++ в Unreal
C++ для Unreal: основы языкаскороЯзык C++ с нуля в объёме, нужном для Unreal: типы, функции, классы, заголовки и исходники, ссылки и указатели в первом приближении и как читать код движка.Память: указатели, ссылки и время жизнискороГде живут данные программы и кто их убирает: стек и куча, указатель как адрес, висячие указатели и утечки, умные указатели и почему у объектов Unreal есть сборщик мусора.Первый класс на C++ в UnrealскороПо шагам: создать класс актора, свойства и функции, видимые в редакторе, Blueprint-наследник, сборка и быстрая перекомпиляция без перезапуска редактора.UObject: отражение, свойства и сборка мусораскороЧто делают макросы UCLASS и UPROPERTY: движок знает о твоих классах всё — для редактора, сохранений, сети и сборки мусора. Как работает сборщик и почему объект пропадает, если на него никто не держит ссылку.Модули, плагины и сборка проектаскороКак устроен проект Unreal на C++: модули и зависимости между ними, плагины, инструмент сборки и почему проект иногда перестаёт собираться после обновления движка.
Каркас игры
Каркас игры в Unreal: режим, контроллер и пешкаскороКто за что отвечает в игре на Unreal: правила матча, состояние игры и игрока, контроллер как воля игрока, пешка как тело, интерфейс — и где хранить данные, которые живут между уровнями.Ввод: от кнопки до действияскороКак нажатие становится прыжком: действия вместо кнопок, наборы раскладок под ситуацию, условия — удержание, двойное нажатие, мёртвая зона — и переназначение клавиш.Камера в игре: держатель, пружина и тряскаскороКак камера следует за героем: штанга с пружиной, которая не проходит сквозь стены, сглаживание поворота, смена камер, тряска от ударов и приближение при прицеливании.Движение персонажа: ходьба, прыжок, склоны и ступенискороКак персонаж двигается по миру: капсула, режимы ходьбы, падения и плавания, склоны и ступени, разгон и торможение — и почему движение персонажа не физика тела, а свои правила.Взаимодействие: что под прицелом и что можно взятьскороКак игра понимает, на что смотрит игрок и что можно сделать: луч из камеры, зона вокруг персонажа, подсветка, один общий способ взаимодействия для дверей, предметов и персонажей.Стрельба: мгновенный луч или летящий снарядскороКак в игре стреляют: мгновенная проверка лучом и снаряд, который летит, падает и отскакивает, разброс и отдача, урон по частям тела и как сделать попадание честным и приятным.Данные отдельно от кода: таблицы и ассеты данныхскороПочему урон меча, цену зелья и скорость врага держат не в коде, а в таблицах и ассетах данных: правки без программиста, баланс в одном месте, ссылки на ассеты и их подгрузка.Инвентарь: данные и отображениескороКак устроен инвентарь: описание предмета отдельно от его экземпляров, стопки и слоты, вес и места, перенос между контейнерами и почему интерфейс инвентаря не должен хранить сами предметы.Сохранения: что записать и как загрузитьскороКак сохранить игру: что на самом деле нужно записать, а что можно восстановить, сохранение мира и игрока, версии сохранений после обновлений и почему сохранения ломаются.Gameplay Ability System: способности, эффекты и атрибутыскороКак устроена система способностей Unreal: атрибуты вроде здоровья и маны, эффекты, которые их меняют, способности со стоимостью и перезарядкой, метки состояний и работа по сети.
Паттерны и архитектура
Паттерны: проверенные решения частых задачскороЧто такое паттерн программирования: способ, которым много раз решали похожую задачу. Зачем знать их названия, когда паттерн помогает и когда только усложняет код.Машина состоянийскороКак описать поведение, которое зависит от того, что происходит сейчас: стоит, бежит, прыгает, оглушён. Состояния, переходы и условия — и почему это проще горы флажков «если, если, если».Наблюдатель: события вместо проверокскороКак одна система узнаёт об изменениях в другой, не проверяя её каждый кадр: подписка на событие, рассылка, отписка и ловушки — порядок вызова и подписчики, которых уже нет.Команда: действие как предметскороКак превратить действие в объект, который можно сохранить, повторить и отменить: отмена в редакторе уровней, запись повтора, очередь приказов в стратегии, переназначение клавиш.Пул объектов: не создавать каждый раз зановоскороПочему пули, искры и всплывающие цифры не создают и не удаляют каждый раз: заранее созданный запас, выдача и возврат, сброс состояния и когда пул не нужен.Пространственное разбиение: сетки и деревьяскороКак быстро найти, кто рядом: сетка ячеек, деревья, делящие пространство пополам и на восемь частей, деревья обёрток. Ими пользуются физика, ИИ, отрисовка и сеть.ECS: данные вместо объектовскороПочему для десятков тысяч одинаковых сущностей объекты с методами медленны и как устроен подход «сущность — компоненты — системы»: данные подряд в памяти, системы над массивами. Mass в Unreal.Архитектура игры: модули и зависимостискороКак разложить большой проект, чтобы правка в одном месте не ломала десять других: слои и модули, кто о ком знает, события между системами, подсистемы движка и плагины для своих систем.
Скорость и память
Профайлер: Unreal Insights по шагамскороПо шагам: записать трассу, найти долгий кадр, разобрать его по потокам и функциям, отличить нагрузку процессора от ожидания видеокарты и проверить поправку.Цена тика: что считать каждый кадрскороПочему тысяча акторов с пустым тиком тормозит: стоимость вызова каждый кадр, тик реже и по событию, группы и порядок тика и что переносить из тика в таймеры и события.Загрузка без фризов: мягкие ссылки и подгрузка в фонескороПочему игра замирает при открытии меню или входе в новую зону: жёсткие ссылки тянут за собой весь граф ассетов. Мягкие ссылки, подгрузка в фоне, загрузочные экраны и как увидеть, что загружается.Сборка мусора и рывкискороПочему раз в несколько секунд кадр подпрыгивает: сборщик мусора проходит по всем объектам. Как уменьшить его работу: меньше временных объектов, пулы, кластеры и настройки частоты.Потоки: работа параллельноскороКак игра использует много ядер процессора: игровой поток, поток рендера, задачи в фоне, почему два потока не должны менять одно и то же и что такое гонка данных.Память игры: куда уходят гигабайтыскороИз чего складывается память игры: текстуры, модели, звук, анимации, объекты и код. Как посмотреть, кто сколько занимает, бюджеты под платформу и что будет, когда память кончится.
Грабли Unreal
Грабли BlueprintsскороЧастые поломки в Blueprints: пустая ссылка, порядок запуска акторов, приведение типа, которое тянет за собой пол-игры, тик, который никто не выключил. Симптом, причина, решение.Грабли C++ в Unreal: падения и пропавшие объектыскороЧастые падения и странности в C++: объект собран сборщиком мусора, указатель без UPROPERTY, вызов до инициализации, проект не собирается после смены версии. Симптом, причина, решение.Грабли Unreal: сборка и рантаймскороТо, что работает в редакторе и ломается в сборке или посреди игры: симптомы, причины, решения.