Подробный список изменений: - Перенесены эффекты частиц из 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-индекс проекта.
67 lines
3.1 KiB
C#
67 lines
3.1 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|