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