Danil Iarosh 839a68aef1 Improve VFX, UI overlays, session statistics, COM reliability, audio mixer, and expand architecture guides
Подробный список изменений:
- Перенесены эффекты частиц из C#-кода в готовые префабы-ассеты (Vfx Prefabs) в папке Assets/Resources/Vfx/ с автоматической генерацией материалов в Editor.
- Исправлены ошибки duration на играющих системах частиц и розовые текстуры в GameVfxService.cs.
- Исправлена навигация и фокус кнопок на оверлеях ContinueGameOverlay и PrizeResultOverlay с автоматическим подсвечиванием кнопок лимонно-зеленым цветом при фокусе и проигрыванием звука.
- Добавлена проверка настроек в GameplayHudController.cs для скрытия ContinueGameOverlay, если продолжение игры отключено.
- Расширен сбор статистики: создана структура GameplaySessionRecord, добавлена история до 50 раундов в PrizeSessionStateService и JsonPrizeSessionStateRepository, выведен расчет средних показателей и список 5 последних раундов в сервисной статистике.
- Повышена надежность COM-транспорта: добавлен sleep (80мс) в Dispose для graceful shutdown потоков, реализован цикл переподключения до 10 попыток при обрыве связи.
- Интегрированы настройки громкости с микшером: изменен шаг изменения громкости на 5% (0.05) для удобства, добавлен статус-чек и логи в ApplyServiceVolumes, расширены юнит-тесты на GetFloat параметры.
- Созданы новые архитектурные гайды по аппаратному COM-транспорту и призовой экономике автомата в папке GUIDES/architecture/.
- Оптимизирован и обновлен RAG-индекс проекта.
2026-07-03 15:04:08 +03:00

67 lines
3.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using Zenject;
using DanroJump.Audio;
using DanroJump.Prizes;
using DanroJump.SceneFlow;
namespace DanroJump.Settings
{
/// <summary>
/// ProjectContext/SceneContext installer сервисных настроек.
/// ProjectContext/SceneContext installer глобальных сервисов.
/// </summary>
public sealed class AppServicesInstaller : MonoInstaller
{
[SerializeField] private string databaseAddress = ServiceSettingsAddressKeys.Database;
[SerializeField] private ServiceSettingsDatabase fallbackDatabase;
[SerializeField] private GameAudioSettings audioSettings;
[SerializeField] private string fileName = "service-settings.json";
[SerializeField] private string prizeSessionStateFileName = "prize-session-state.json";
[SerializeField] private bool loadImmediately = true;
[SerializeField] private bool bindActionsInScene = true;
/// <summary>
/// Загружает базу настроек, создает сервис и регистрирует его в DI-контейнере.
/// </summary>
public override void InstallBindings()
{
var databaseProvider = new AddressableServiceSettingsDatabaseProvider(databaseAddress, fallbackDatabase);
var database = databaseProvider.Load();
if (database == null)
{
Debug.LogError($"{nameof(AppServicesInstaller)} could not load {nameof(ServiceSettingsDatabase)}.", this);
databaseProvider.Dispose();
Container.BindInterfacesAndSelfTo<SceneFlowService>().AsSingle();
return;
}
var repository = new JsonServiceSettingsRepository(fileName);
var prizeSessionRepository = new JsonPrizeSessionStateRepository(prizeSessionStateFileName);
var service = new ServiceSettingsService(database, repository);
if (loadImmediately)
{
service.Load();
}
Container.BindInstance(database).AsSingle();
Container.Bind<IServiceSettingsDatabaseProvider>().FromInstance(databaseProvider).AsSingle();
Container.Bind<System.IDisposable>().FromInstance(databaseProvider).AsSingle();
Container.Bind<IServiceSettingsRepository>().FromInstance(repository).AsSingle();
Container.Bind<IReadOnlyServiceSettings>().FromInstance(service).AsSingle();
Container.Bind<IServiceSettingsService>().FromInstance(service).AsSingle();
Container.Bind<IPrizeSessionStateRepository>().FromInstance(prizeSessionRepository).AsSingle();
Container.BindInterfacesAndSelfTo<PrizeSessionStateService>().AsSingle();
Container.BindInterfacesAndSelfTo<SceneFlowService>().AsSingle();
if (audioSettings != null)
{
Container.BindInstance(audioSettings).AsSingle();
}
Container.BindInterfacesAndSelfTo<GameAudioService>().AsSingle().NonLazy();
Container.BindInterfacesTo<AppUIFacadeInjector>().AsSingle().WithArguments(bindActionsInScene).NonLazy();
}
}
}