22 KiB
Архитектура проекта "Mario-like platformer"
Обзор
Это 2D-платформер на Unity, созданный по образу классических игр Mario. Проект реализован на C# с использованием Unity 2D и включает систему управления через клавиатуру или COM-порт (для аркадных автоматов).
Основные технологии
- Unity Engine (версия для 2D)
- Unity Input System - новая система ввода
- Unity Audio Mixer - управление звуком
- Visual Effect Graph - визуальные эффекты
- Addressables - динамическая загрузка ресурсов
- Universal Render Pipeline (URP) - графический конвейер
Структура проекта
📁 Assets/Scripts/
1. Abstract/ - Базовые абстракции
Interfaces.cs- интерфейсы проекта:IRecallable- для возвращаемых объектовIPickable- для подбираемых предметовIDamageable- для объектов, получающих уронILaunchable- для запускаемых снарядовIBouncy- для отскакивающих объектов
Enums.cs- перечисления (Direction2D и др.)
2. Managers/ - Центральные менеджеры (паттерн Singleton)
Основные управляющие классы игры:
GameManager.cs - Главный менеджер игры
- Singleton с автоинициализацией через
[RuntimeInitializeOnLoadMethod] - Управляет всеми остальными менеджерами
- Хранит игровое состояние:
- Жизни игрока (Lives)
- Монеты (Coins)
- Текущий мир и уровень (World, Stage)
- Состояние паузы (IsPaused)
- Управляет спавном игрока
- Система событий:
PauseStateChanged- изменение паузыPlayerSpawned- спавн игрокаCoinsChanged,LivesChanged,MaxLivesChanged- изменение игровых параметровGameOverEvent,GameWonEvent- завершение игры
- Интегрирует логирование через
CompositeLogger
SettingsManager.cs - Управление настройками
- Загрузка/сохранение настроек в JSON
- Работа с
GameSettingsScriptableObject - События:
OnSettingsLoaded,OnSettingsSaved - Применение настроек к игре
AudioManager.cs - Управление звуком
- Управление фоновой музыкой:
- Плавные переходы (fade in/out)
- Кроссфейд между треками
- Пул AudioSource для звуковых эффектов (SFX)
- Интеграция с AudioMixer
- Round-robin система для проигрывания SFX
PaymentManager.cs - Система оплаты
- Управление кредитами для аркадного автомата
- Интеграция с COM-портом для приема монет
- События:
OnCreditsChanged,OnCreditAdded,OnCreditRemoved - Поддержка бесплатной игры
- Опциональное сохранение кредитов между сессиями
PrizeSystemManager.cs - Система призов
- Управление выдачей призов
- Интеграция с внешним оборудованием через COM
GlobalsManager.cs - Глобальные настройки
- Загрузка глобальных префабов
- DontDestroyOnLoad объекты
3. Behaviour/ - Игровое поведение
Camera/
CameraFollow.cs- Следование камеры за игроком:- Плавное следование с damping
- Offset в зависимости от направления взгляда игрока
- Автоматический поиск игрока на сцене через корутину
BindLoop() - Snap к игроку при первом обнаружении
CameraManager.cs- Управление камерой на уровнеCameraControlTrigger.cs- Триггеры для особого поведения камерыCinemachineFindPlayer.cs- Интеграция с Cinemachine
Controllers/
-
PlayerController.cs- Управление игроком:- Физика через Rigidbody2D
- Input System для управления (moveAction, jumpAction)
- Настройки движения: скорость, ускорение, торможение
- Прыжки с variable jump height
- Проверка приземления через GroundCheck
- Интеграция с системой здоровья (Health)
- Анимации через Animator
- Звуковые эффекты (шаги, урон, прыжки)
- Реализует интерфейс
IDamageable
-
EnemyController.cs- Управление врагами -
MusicController.cs- Контроллер музыки на сценах
Checkpoints/
Checkpoint.cs- Чекпоинты на уровнеPlayerSpawn.cs- Точки спавна игрокаCheckpointSystem.cs- Система управления чекпоинтами
Projectiles/ - Система снарядов
Projectile2D.cs- Базовый снарядBasicProjectile.cs- Простой снарядPhysicsProjectile.cs- Снаряд с физикойPickableProjectile.cs- Подбираемый снарядEnemyBasicProjectile.cs- Снаряды врагов
ThrowProjectiles/ - Система стрельбы
FireScript2D.cs- Базовая стрельбаPlayerFireScript.cs- Стрельба игрокаEnemyFireScript.cs- Стрельба врагов
Другое
Health.cs- Компонент здоровья:- Максимальное и текущее здоровье
- TakeDamage, Heal, ResetHealth
- Связь с владельцем через
IDamageable
Parallax.cs- Эффект параллакса для фонаLightDimmer.cs- Управление освещением
4. Entities/ - Игровые сущности
Платформы:
MovingPlatform.cs- Движущиеся платформыOscillator.cs- Осциллирующие платформыShiftingPlatform.cs- Смещающиеся платформыVanishingPlatform.cs- Исчезающие платформы:- Плавное исчезновение/появление (fade in/out)
- Корутины
Vanish()иReappear() - Отключение CompositeCollider2D
- Работа с массивом SpriteRenderer для анимации прозрачности
Props/ - Интерактивные объекты
Collectible.cs- Собираемые предметыCoinCollectible.cs- МонетыTrap.cs- Ловушки
Другое:
JumpPad2D.cs- ТрамплиныRotator.cs- Вращающиеся объектыLightActionsController.cs- Управление светом
5. Controls/ - Система управления
Inputs/ - Абстракция ввода
-
In.cs- Статический фасад для унифицированного доступа к вводу:- Выбор источника ввода (клавиатура/COM)
- Автоматическая инициализация
- Единый интерфейс для игровой логики
-
InputSource.cs- Базовый класс источника ввода -
InputSourceType.cs- Типы источников (Keyboard/COM) -
KeyboardInput.cs- Ввод с клавиатуры -
COMInput.cs- Ввод через COM-порт
ComSystem/ - Работа с COM-портом
ComWrapper.cs- Обертка для работы с COMComNativeWrapper.cs- Нативные вызовыPrizeSystem.cs- Интеграция призовой системы
Другое:
PlayerAction.cs- Действия игрокаButtonPinMapping.cs- Маппинг кнопок на пиныComInputToInputSystemAdapter.cs- Адаптер COM → Input System
6. UI/ - Пользовательский интерфейс
MainMenu.cs- Главное менюPauseMenu.cs- Меню паузыGameEndUIController.cs- UI завершения игрыLoseBannerController.cs- Баннер поражения (с таймером продолжения)SettingsUI.cs- UI настроекSettingsUIList.cs- Список настроек:- Слайдеры громкости (музыка/SFX)
- Тогглы оплаты (бесплатная игра, призы)
- Настройки жизней игрока
LevelSelectModal.cs- Модальное окно выбора уровняLevelButton.cs- Кнопка уровняTopPanelTextController.cs- Верхняя панель с информациейUICreditsTextController.cs- Отображение кредитовQRCodeUIController.cs- Отображение QR-кодовUIPointer.cs- Указатель в менюScrollSelectionFollower.cs- Следование скролла за выбранным элементомModalFocusTrap.cs- Захват фокуса в модальных окнахFullscreenToggle.cs- Переключение полноэкранного режима
7. ScriptableObjects/ - Ресурсы конфигурации
-
GameSettings.cs- Настройки игры:- Общие: полноэкранный режим, громкость
- Оплата: бесплатная игра, призы, телефон
- Игрок: стартовые жизни, прирост жизней
- Методы:
SetDefaultValues(),ValidateSettings(),ApplySettings()
-
SFXAsset.cs- Набор звуковых эффектов -
EnemySFXAsset.cs- Звуки врагов -
EnemyControllerConfiguration.cs- Конфигурация врагов -
EnemyFireConfiguration.cs- Конфигурация стрельбы врагов
8. Animations/ - Анимационные события
PlayerAnimationEvents.cs- События анимаций игрокаEnemyAnimationEvents.cs- События анимаций врагов
9. Audio/ - Звуковая система
SoundEffect.cs- Базовый звуковой эффектLevelPlayerSFX.cs- SFX для уровня
10. FX/ - Визуальные эффекты
PlayerRunVFX.cs- Эффекты бега игрокаCheckPointFX.cs- Эффекты чекпоинтов
11. Utilities/ - Вспомогательные утилиты
FileLogger.cs- Логирование в файлCompositeLogger.cs- Комбинированное логированиеLoggerInitializer.cs- Инициализация логгераDebugSettings.cs- Настройки отладкиQRCodeUtils.cs- Утилиты для QR-кодовPhoneNumberUtils.cs- Валидация телефонных номеров (мультистрановая)AutoCursorHider.cs- Автоматическое скрытие курсораReadOnlyInInspectorAttribute.cs- Атрибут только для чтения в InspectorAdvancedLoggingExample.cs- Пример продвинутого логирования
12. Editor/ - Редакторские скрипты
MusicController_Inspector.cs- Кастомный инспектор для MusicController
13. Settings/_sega/ - Альтернативная система настроек (для SEGA автоматов)
SettingsScreen.cs- Экран настроекSettingsManager.cs- Менеджер настроекSettingsCombination.cs- Комбинации настроекSettingOption.cs- Отдельная настройкаGameSettings.cs- Настройки игры
Архитектурные паттерны
1. Singleton Pattern
Все менеджеры реализованы как синглтоны с автоинициализацией:
public static GameManager Instance { get; private set; }
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Initialize()
{
if (Instance != null) return;
GameObject go = new GameObject(nameof(GameManager));
Instance = go.AddComponent<GameManager>();
DontDestroyOnLoad(go);
}
2. Event-Driven Architecture
Все менеджеры используют события для коммуникации:
public event Action<bool> PauseStateChanged;
public event Action<GameObject> PlayerSpawned;
public UnityEvent<int> OnCreditsChanged;
3. Dependency Injection через Inspector
Компоненты конфигурируются через Inspector с использованием SerializeField:
[SerializeField] private InputActionReference moveAction;
[SerializeField] private float moveSpeed = 8f;
4. Component-Based Architecture
Игровые объекты состоят из переиспользуемых компонентов:
Health- здоровьеPlayerController- управлениеAnimator- анимация
5. Interface Segregation
Четко определенные интерфейсы для разных типов поведения:
IDamageable- может получать уронIPickable- можно подобратьILaunchable- можно запустить
6. Facade Pattern
In.cs предоставляет единый интерфейс для работы с разными источниками ввода.
7. Object Pool
AudioManager использует пул AudioSource для эффективного проигрывания SFX.
8. ScriptableObject Configuration
Конфигурация через ScriptableObjects для удобного редактирования:
GameSettingsSFXAssetEnemyControllerConfiguration
Потоки данных
1. Инициализация игры
Runtime Initialize → GameManager.Awake()
├── Инициализация Logger
├── Загрузка Globals
├── Инициализация SettingsManager
├── Инициализация AudioManager
└── Инициализация PaymentManager
2. Игровой цикл
Player Input → InputSystem/COMInput
↓
PlayerController.Update/FixedUpdate
↓
Physics (Rigidbody2D)
↓
Animator
↓
Camera Follow
3. Система урона
Trap/Enemy → IDamageable.TakeDamage()
↓
Health.TakeDamage()
↓
Health <= 0? → IDamageable.Die()
↓
GameManager.GameOverEvent
4. Система настроек
SettingsUI → GameSettings (ScriptableObject)
↓
SettingsManager.SaveSettings()
↓
JSON File (persistentDataPath)
↓
SettingsManager.LoadSettings()
↓
GameSettings.ApplySettings()
Ключевые особенности
1. Поддержка аркадных автоматов
- Ввод через COM-порт
- Система приема монет
- Выдача призов
- Бесплатная игра (настраиваемо)
2. Гибкая система управления
- Unity Input System
- Поддержка клавиатуры и аркадных кнопок
- Легко расширяемая через
InputSource
3. Продвинутое логирование
- Составное логирование (консоль + файл)
- Категории логов
- Уровни важности
4. Система сохранения
- JSON сериализация настроек
- Сохранение в
persistentDataPath - Валидация при загрузке
5. Аудио система
- Плавные переходы музыки
- Эффективный пул для SFX
- Интеграция с AudioMixer
6. UI навигация
- Поддержка навигации без мыши (для автоматов)
- Визуальный указатель выбора
- Автоскролл к выбранному элементу
- Модальные окна с фокусом
Пространства имен
Проект использует следующие пространства имен:
RR.Game2D.Core- основной функционал игрыRR.Game2D.Core.Managers- менеджерыRR.Game2D.Behaviour- поведение объектовRR.Game2D.Entities- игровые сущностиRR.Common.Managers- общие менеджерыRR.Common.Controls- система управленияRR.Common.UI- пользовательский интерфейсRR.Common.Interfaces- интерфейсыRR.Common.Utility- утилитыRR.Common.Audio- звуковая системаRR.Common.Behaviour.ScriptableObjects- ScriptableObjects
Зависимости и интеграции
Unity пакеты:
- Input System
- Universal Render Pipeline (URP)
- Visual Effect Graph
- Addressables
- Cinemachine (опционально)
- TextMeshPro
Внешние зависимости:
- System.IO.Ports (для COM-порта)
- System.Text.Json (для сохранения настроек)
Принципы разработки
- Модульность - каждый компонент независим и переиспользуем
- Расширяемость - легко добавлять новые функции через интерфейсы
- Конфигурируемость - большинство параметров настраивается в Inspector
- Отказоустойчивость - валидация, проверки на null, fallback значения
- Производительность - пулы объектов, кэширование компонентов
- Читаемость - четкие названия, комментарии, XML документация
- Отладка - продвинутая система логирования
Структура сцен
Persistent Scene (DontDestroyOnLoad):
- GameManager
- SettingsManager
- AudioManager
- PaymentManager
- Globals
Level Scene:
- Player
- Enemies
- Platforms
- Collectibles
- UI Canvas
- Camera
- Lighting
Порядок выполнения (Execution Order)
- -1000: GameManager (через
[DefaultExecutionOrder(-1000)]) - Default: Остальные компоненты
- Late Update: Camera Follow
Рекомендации по расширению
Добавление нового врага:
- Создать префаб с компонентами Rigidbody2D, Collider2D, Animator
- Добавить компонент
Healthи реализоватьIDamageable - Добавить
EnemyControllerили создать новый контроллер - Создать
EnemySFXAssetиEnemyControllerConfiguration
Добавление новой платформы:
- Наследоваться от MonoBehaviour
- Использовать Rigidbody2D для физики
- Реагировать на
OnCollisionEnter2D/OnCollisionExit2D - Использовать корутины для анимаций
Добавление нового источника ввода:
- Создать класс, наследующий
InputSource - Реализовать методы
Initialize(),GetAxis(),GetButton()и т.д. - Добавить новый тип в
InputSourceType - Обновить switch в
In.Initialize()
Добавление новой настройки:
- Добавить поле в
GameSettings - Обновить UI в
SettingsUIList - Добавить валидацию в
GameSettings.ValidateSettings() - Реализовать применение в
GameSettings.ApplySettings()
Известные особенности
-
Двойная система настроек: Есть основная система настроек и альтернативная в папке
_segaдля специфичных аркадных автоматов. -
Временные файлы: Файлы с суффиксом
_Tempявляются временными решениями или устаревшими версиями. -
COM-интеграция: Работа с COM-портом требует правильной настройки прав доступа в Windows и корректного маппинга пинов.
-
Логирование: Логи пишутся в файл
game.logв корневой папке проекта (рядом с Assets). -
Ресурсы: Префабы загружаются из папки Resources по заданным путям (настраиваемо в Inspector).
Автор
Проект разработан с использованием пространства имен RR (предположительно инициалы разработчика или компании).
Документ создан автоматически на основе анализа структуры проекта.