Проектування архітектури програмного коду ігор
Через рік розробки без архітектури відбувається наступне: GameManager — клас на 3000 рядків, який знає про все. PlayerController чіпляється напряму до UIManager, тому що «так швидше». Система квестів викликає SaveSystem, який викликає EventSystem, який викликає QuestSystem — circular dependency, яку неможливо розплутати без переписування половини гри. Новий розробник у команді боїться чіпати код, тому що незрозуміло, що на що впливає.
Це не абстрактна теорія — це те, що ми бачимо в проєктах, які приходять на оптимізацію або масштабування після 6–12 місяців активної розробки без архітектурного плану.
Чому модульність критична для ігрової архітектури?
Модульна архітектура — це не про красу, а про виживання проєкту. Коли кожна система ізольована, ви можете змінювати одну частину, не боячись зламати іншу. На практиці це означає, що модулі не повинні знати про існування один одного. І бізнес-логіка не повинна залежати від Unity-специфічного коду. Другий принцип дозволяє тестувати логіку через звичайні C# unit tests без запуску PlayMode. Якщо система розрахунку шкоди в RPG — це чистий C# клас без MonoBehaviour — її можна покрити тестами за годину.
Як вибрати між Service Locator і Dependency Injection?
У Unity класичний вибір. DI-фреймворки (Zenject/Extenject, VContainer) дають повноцінний IoC Container з constructor injection. Це правильно з точки зору SOLID, але потребує дисципліни команди. Service Locator (через статичний реєстр сервісів) — компроміс: простіший у освоєнні, не потребує розуміння DI-контейнерів, але втрачає перевагу щодо тестованості. Для невеликих команд (2–4 програмісти) часто обираємо VContainer як баланс між строгістю та простотою.
Коли застосовувати Event-driven і State Machine?
Event-driven architecture через ScriptableObject Events — патерн від Ryan Hipple (Unite 2017): ScriptableObject як канал подій. Компоненти підписуються на GameEvent-ассети, не знаючи один про одного. Player отримує шкоду → викликає playerDamagedEvent.Raise(). HUD слухає цю подію і оновлює HP-бар. VFX-менеджер слухає і спавнить ефект. Жодних прямих посилань. Це вирішує проблему зв'язності та спрощує роботу у великій команді — художник може підключити свій ефект до події без правки коду. State Machine як основа логіки персонажів. Hierarchical State Machine (HSM) для AI і Player Controller — не Animator State Machine (це тільки для анімацій), а окрема реалізація в коді. Явні стани усувають «спагеті» з boolean-флагів: isAttacking && !isStunned && canJump && !isReloading.
ECS для високопродуктивного коду
Unity DOTS (Entities 1.x) виправданий там, де потрібно оновлювати тисячі об'єктів: симуляція частинок, RTS з сотнями юнітів, процедурний світ. Вхід у DOTS потребує повної переробки архітектури — це не «додамо поверх». Рішення ухвалюється на початку проєкту.
Структура проєкту та розподіл відповідальності
Ми проектуємо архітектуру виходячи з двох ключових принципів: модулі не повинні знати про існування один одного, і бізнес-логіка не повинна залежати від Unity-специфічного коду. Наш досвід показує, що дотримання цих правил у 90% випадків запобігає регресійним багам при додаванні нових фіч.
Типова шарова архітектура для Unity-проєкту:
- Domain — чисті C# класи: моделі даних, бізнес-логіка (DamageCalculator, QuestLogic, SaveData)
- Application — Use Cases, координація між доменними сервісами
- Infrastructure — Unity-специфічний код (MonoBehaviour, ScriptableObject, Addressables), мережеві виклики, збереження
- Presentation — UI, візуальні ефекти, аудіо
Реальний кейс: мобільна стратегія, команда 6 осіб. Після 4 місяців розробки — 40% часу йшло на баг-фіксінг побічних ефектів: зміна однієї системи ламала іншу. Провели архітектурний рефакторинг за 3 тижні: ввели VContainer для DI, виділили Domain-шар з GameManager, замінили прямі посилання між компонентами на ScriptableObject Events. Наступні 2 місяці — нуль регресійних багів від рефакторингу.
Що входить в роботу
| Deliverable |
Опис |
| Архітектурний план |
Схема модулів, залежності, вибрані патерни з обґрунтуванням |
| ADR документація |
Запис кожного ключового рішення з контекстом і альтернативами |
| Налаштування DI-контейнера |
Інтеграція VContainer/Zenject, реєстрація сервісів, тести контейнера |
| Впровадження івент-системи |
ScriptableObject Events, підписки, відписки, дебаг-інструменти |
| Code review і навчання |
Парне програмування в перші 2 тижні, шаблони та naming conventions |
| Технічна підтримка |
2 тижні пост-релізної підтримки з питань архітектури |
Процес проектування архітектури
- Аналітика — збираємо вимоги: тип гри, команда, терміни, майбутні фічі. Архітектура має відповідати масштабу — для гіпер-казуалу з 3 системами та командою 2 особи Zenject надлишковий.
- Проєктування — створюємо Architecture Decision Record (ADR) з обґрунтуванням кожного ключового рішення. Чому VContainer, а не Zenject. Чому ScriptableObject Events, а не UnityEvent. Чому Addressables, а не Resources. ADR стає частиною технічної документації проєкту.
- Реалізація — готуємо структуру папок, naming conventions, шаблонні класи для основних патернів. Перші 2 тижні — парна розробка з командою для закріплення патернів.
- Тестування — покриваємо Domain-шар unit-тестами, перевіряємо інтеграцію через playmode-тести на критичних сценаріях.
- Деплой — CI/CD з перевіркою архітектурних правил (наприклад, заборона прямих посилань між шарами).
| Масштаб завдання |
Орієнтовні терміни |
| Консультація + архітектурний план (новий проєкт) |
3–7 днів |
| Рефакторинг архітектури існуючого проєкту |
3–8 тижнів |
| Повне проєктування архітектури з документацією |
2–4 тижні |
| Впровадження ECS/DOTS у проєкт |
4–10 тижнів |
Вартість розраховується індивідуально після аудиту проєкту або концепції.
Типові ознаки проблемної архітектури
- GameManager >1000 рядків з різноплановою логікою
- Циклічні залежності між системами
- Неможливість написати unit-тест без запуску всієї сцени
- Кожна зміна потребує правки 5+ файлів
- «Прокляття булевих флагів»: умови на кшталт
if (isAttacking && !isStunned && canJump) розмазані по всьому коду
Зв'яжіться з нами для отримання консультації або замовлення аудиту архітектури вашого проєкту. Ми гарантуємо прозорий підхід і фіксовані терміни. Зверніться до нашого досвіду — понад 50 архітектурних рефакторингів для ігор різних жанрів.
Планування ігрового проєкту
Типова ситуація: до нас приходить команда після трьох місяців розробки з питанням «чому у нас у репозиторії 40 гігабайт і Git падає при кожному pull?». Відповідь майже завжди одна: PNG-текстури та FBX-файли закомічені безпосередньо без Git LFS, історія репозиторію роздулася до непрацездатного стану. Це вирішується, але переписування історії в живому проєкті — болючий процес, якого можна було легко уникнути. Ми бачимо таке у 90% звернень — наслідок відсутності технічного планування на старті.
Планування ігор — це не про діаграми Ганта. Це про технічні рішення перших двох тижнів, які не стануть проблемами через три місяці. Наш досвід — 7 років у геймдеві, понад 25 реалізованих проєктів під мобільні (iOS/Android), PC та консолі (Nintendo Switch, Xbox). Ми гарантуємо, що після нашого планування ви не зіткнетеся з архітектурними «граблями», на які наступають 90% недосвідчених команд.
Чому планування ігор — це не про Ганта?
Графік робіт — тільки вершина. Справжнє планування ігрового проєкту включає:
- жорстку фіксацію цільових платформ і мінімальних вимог (наприклад, iPhone 11, 60 fps);
- декомпозицію механік до числових параметрів з версіонуванням;
- вибір стеку, від якого залежить вся архітектура (render pipeline, мережа, ECS);
- налаштування інфраструктури до першого коміту з асетами.
Без цього «план» — список завдань без опори. Через місяць з'ясовується, що Unreal-проєкт збірки під мобільні платформи не тягне, а ECS виявився надлишковим для простого раннера. Час витрачено, бюджет пішов на прототипи, які потрібно переписувати. Правильне планування скорочує час релізу в середньому на 2 місяці (економія до 40% продакшен-етапу) і знижує кількість багів на 30%.
Документація: GDD як живий інструмент
GDD (Game Design Document) у поганому виконанні — це 80-сторінковий PDF, який ніхто не читає після другого спринту. GDD у хорошому виконанні — це структурована база знань, яку команда реально використовує щодня.
Що має бути в GDD
Мінімальний набір, без якого не можна починати розробку:
- Геймплейні системи — точний опис кожної механіки з параметрами. Не «персонаж стрибає», а «стрибок: висота 2.4 юніти, час у повітрі 0.6 сек, є 150 мс coyote time, double jump дозволено, приземлення блокує атаку на 200 мс». Числа можуть змінюватися в ході балансування, але вони мають бути зафіксовані та версіоновані.
- Технічні обмеження — цільові платформи, мінімальні вимоги до заліза, обмеження по пам'яті та draw calls. Якщо гра має працювати на iPhone 11 з 60 fps, це обмеження впливає на всі арт-рішення з самого початку.
- Scope та фічі — явний список того, що входить у MVP і що залишається на потім. «Можливо додамо крафтинг» — це не планування, це джерело feature creep.
- Референси — конкретні ігри з конкретними механіками, які беруться за основу. «Як у Dark Souls, але швидше» — це робочий референс для combat designer.
Як ми ведемо GDD
Використовуємо Notion або Confluence — GDD живе як wiki, а не як файл. Зміни видно в історії, можна залишати коментарі, механіки пов'язані між собою перехресними посиланнями. Технічний дизайн і художній дизайн зберігаються окремими розділами, але посилаються один на одного. Кожна механіка має статус: в розробці, готово, на рев'ю, заморожено. Це дозволяє в будь-який момент зрозуміти реальний стан проєкту без дзвінків.
Технічна архітектура
Вибір стеку — не релігія
Вибір між Unity та Unreal розбираємо детально в загальному розділі каталогу. Але на етапі планування є кілька суміжних рішень, критично важливих для проєкту:
-
Render pipeline в Unity. URP — для мобільних та VR. HDRP — для PC/консолей. Built-in (Legacy) — тільки якщо берете старий проєкт. Змінювати pipeline в середині розробки — перезбірка всіх матеріалів. Рішення приймається в день першого коміту.
-
Архітектура ігрових об'єктів. Класичний MonoBehaviour проти ECS (Entity Component System через Unity DOTS). ECS дає приріст продуктивності до 10 разів на тисячах об'єктів, але різко збільшує складність коду. Для гіперказуальних ігор — надлишково. Для стратегій — необхідно.
-
Мережева архітектура. Якщо мультиплеєр планується — рішення приймається до першої ігрової механіки. Single-player і networked code влаштовані принципово по-різному: в мережевій грі кожна зміна стану має бути явною та синхронізованою.
ScriptableObjects як конфігураційний шар
В Unity використовуємо ScriptableObject-орієнтований підхід для зберігання ігрових даних. Конфігурація зброї, параметри ворогів, налаштування рівнів — все це ScriptableObject-асети, а не захардкоджені значення. Це дозволяє гейм-дизайнеру змінювати баланс без участі програміста та без перезбірки проєкту.
Версіонування та робота з асетами
Це та область, де більшість невеликих команд втрачає час найприкрішим способом.
Git + Git LFS
Стандартний Git не призначений для бінарних файлів. Текстура 4K в PNG важить 20–50 MB. Якщо її комітити як звичайний файл, історія репозиторію роздувається катастрофічно швидко. Git LFS зберігає бінарні файли окремо, а в Git-історію кладе тільки покажчики. Налаштовується один раз у .gitattributes:
*.png filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.unitypackage filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
Це має бути налаштовано до першого коміту з асетами. Після — болюча міграція, яка може коштувати значних витрат часу розробників. Використання Git LFS замість звичайного Git пришвидшує операції з репозиторієм у 5 разів, коли обсяг асетів перевищує 10 ГБ.
Perforce
Альтернатива для великих Unreal-проєктів. Epic Games самі використовують Perforce. Краще працює з дуже великими репозиторіями (сотні гігабайт), нативна підтримка в Unreal Editor. Вища вартість інфраструктури та складність налаштування.
| Характеристика |
Git + LFS |
Perforce |
| Розмір репозиторію |
до 50 ГБ ефективно |
сотні ГБ |
| Нативна підтримка в Unreal |
немає |
так |
| Складність налаштування |
низька |
середня/висока |
| Вартість інфраструктури |
низька |
середня/висока |
Гілкування
Для ігрових проєктів використовуємо спрощений Git Flow: main, develop, feature/*, release/*. Правило: в main ніколи не комітиться нічого, що не пройшло QA. Його порушення призводить до того, що «остання стабільна версія» стає терміном без змісту.
CI/CD для ігрових проєктів
Автоматична збірка при кожному пуші вирішує проблему «у мене на машині збирається, у тебе ні». Pipeline включає:
- Активація Unity ліцензії (headless)
- Запуск тестів (Unity Test Runner)
- Збірка під Android (APK/AAB)
- Збірка під iOS (Xcode проєкт)
- Збірка під PC (Standalone)
- Завантаження артефактів в S3 або Firebase App Distribution
Час збірки — 15–40 хвилин. Команда отримує свіжу збірку без ручної роботи.
GameCI — GitHub Actions для Unity. Unity Cloud Build — хостинг від Unity, простіше налаштування, дорожче при великій кількості збірок. Jenkins — повний контроль, використовується для консольних платформ.
Приблизний чек-лист для старту проєкту
- [ ] Визначено цільові платформи та мінімальні вимоги
- [ ] Вибрано render pipeline та архітектуру об'єктів
- [ ] Налаштовано Git LFS з
.gitattributes до першого коміту
- [ ] Створено GDD в wiki з розподілом за статусами
- [ ] Налаштовано CI/CD (хоча б GameCI)
- [ ] Визначено scope MVP
Що входить у роботу
- Документація: технічне завдання, GDD (MVP-scope), архітектурна схема, моделі даних.
- Налаштування репозиторію: Git + LFS, правила гілкування, шаблон проєкту, угоди про код.
- CI/CD: конфігурація збірок під всі цільові платформи, автоматичне тестування.
- Доступи: до репозиторію, CI/CD, баг-трекеру; навчання команди роботі з інструментами.
- Підтримка: супровід протягом першого місяця розробки — відповіді на питання, коригування налаштувань, рев'ю архітектурних рішень.
Часові рамки планування
| Етап |
Тривалість |
Результат |
| Технічний бриф |
1–3 дні |
Список платформ, тех. обмеження, попередній вибір стеку |
| GDD v1 (MVP-scope) |
1–2 тижні |
Опис усіх механік MVP, тех. вимоги |
| Технічне проектування |
1 тиждень |
Архітектура систем, схема БД, мережева модель |
| Налаштування інфраструктури |
2–3 дні |
Git + LFS, CI/CD, шаблон проєкту, code style |
| Прототип ключової механіки |
1–2 тижні |
Іграбельний прототип core loop |
Разом до початку повноцінного виробництва: 4–6 тижнів. Це не бюрократія — це страховка від переписування, яка економить до 40% часу на етапі продакшену.
Як планування ігор запобігає технічному боргу?
Помилка в плануванні на першому спринті обходиться в 10 разів дорожче, ніж виправлення на прототипі. Неправильний вибір стеку або відсутність LFS призводять до перезбірки архітектури, втрати комітів та демотивації команди. Грамотне планування ігор — це інвестиція, яка окупається зниженням багів на 30% і прискоренням релізу в середньому на 2 місяці.
Оцінимо ваш проєкт — зв'яжіться з нами, щоб отримати консультацію та детальний план перших кроків. Замовте планування ігрового проєкту та уникніть типових граблів, які ми бачимо в 90% звернень. Скористайтеся нашим досвідом — ми сертифіковані партнери Unity та Unreal Engine, і гарантуємо працездатну архітектуру з першого коміту.