Первый этап разработки игры — Декомпозиция
Давайте разобьём идею на Системы и Контент. Инфраструктура не самая интересная часть, поэтому пока опустим ее.
Важно сказать, что графика в игре - это пиксельарт.
🌎 Пространство:
(Система)
Сетка или Грид — состоит из крупных ячеек
Подсетка — делит крупную ячейку на несколько мелких
Смещение — позволяет сдвинуть объект на дробное значение, для плавности
В обычном Unity мы привыкли всё считать в метрах. Но очевидно, что для игры, ориентированной на пиксель-арт и на сеточное пространство это не лучшая идея. Для этого нам надо сделать систему, которая позволит преобразовывать все взаимодействия в систему сетки. Тогда любой объект мы можем определить через его положение и скорость:
Position = CellCoords + SubCellCoords + Offset01 * SubCellSize
Speed = SpeedMultiplier * Cells / Second
— База скорости в физике 1 м/с, здесь мы говорим, что база скорости 1 клетка в секунду
(Контент)
Уровень — определяет "физику" пространства, размеры и содержит список ячеек.
Ячейка — определяет поведение клетки. Например, клетка болота содержит компоненты, которые ухудшают проходимость, но при этом могут генерировать особых юнитов - жаб.
🦎 Объекты:
(Система)
MobileObject — описывает любой объект, который находится на уровне. В базе, мы должны написать систему, которая будет создавать, удалять и двигать мобов.
(Контент)
Моб — контейнер со списком компонент, которыми можно описать любое поведение. Через моба можно выразить и змею, и квартиру на поле, и грызунов, бегающих по сетке.
🪙Ресурсы:
(Система)
Список ресурсов — система управление списком чисел, валидация, приросты, требования владения.
(Контент)
Ресурс — диапазон значений и число. Золото, например может уйти в минус, а жилье не может.
💎Артефакты:
(Система)
Система владения — артефакт, в отличии от других объектов, может лежать на поле, быть носимым каким-то мобом или принадлежать игроку.
(Контент)
Артефакт — это контейнер компонент + правила того, как поведение объекта меняется в зависимости от владельца. Например, "Чёрная луна" - пока лежит на поле, то время застывает на ночи, если подобрать эффект прекращается.
🔥Эффекты:
(Система)
Всё обо всём — самая сложная система, так как требует доступа ко всей игре, и при этом может влиять на любую ее часть. Эффекты могут быть навешены Артефактами, Объектами, Ячейками. У них могут быть длительности, условия, комбинации и очень специфичная логика.
(Контент)
Эффект — это такой же набор компонент, каждый из которых задает правила того, как и что в игре должно меняться.
Итого:
Почти все системы — это правила по которым мы обрабатываем контент и меняем состояние игры. Контент же — это обычно контейнеры, в которых лежат данные: текст, списки, числа, флаги.
Архитектура, которая идеально ложится на такую структуру - это ECS, Entity Component System. Каждый объект в ней - это просто Id, Entity на которую навешивают компоненты. Чтобы все работало, создаются системы - которые выступают законами, по которым функционирует игровой мир.
Основная сложность всего этого подхода для нас, так это в нашей цели, а именно полная расширяемость игры для моддинга и дополнений. Всё вышеописанное программируется с расчетом на то, что весь контент игры в конце концов, просто будет лежать как папка base и папке mods.
Надеюсь ничего не упустил. Если есть вопросы, особенно по реализации, задавайте 🙂