Подробный список изменений: - Перенесены эффекты частиц из 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-индекс проекта.
127 lines
3.9 KiB
C#
127 lines
3.9 KiB
C#
using UnityEngine;
|
||
using Zenject;
|
||
using DanroJump.SceneFlow;
|
||
|
||
namespace DanroJump.Settings
|
||
{
|
||
/// <summary>
|
||
/// MonoBehaviour-фасад для вызова действий приложения из UI/Unity Events.
|
||
/// </summary>
|
||
public sealed class AppUIFacade : MonoBehaviour
|
||
{
|
||
private IServiceSettingsService settings;
|
||
private ISceneFlowService sceneFlow;
|
||
|
||
/// <summary>
|
||
/// Получает сервис настроек через Extenject.
|
||
/// </summary>
|
||
[Inject]
|
||
public void Construct(
|
||
IServiceSettingsService injectedSettings,
|
||
[InjectOptional] ISceneFlowService injectedSceneFlow = null)
|
||
{
|
||
settings = injectedSettings;
|
||
sceneFlow = injectedSceneFlow;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Вручную назначает сервис настроек, если объект используется вне DI.
|
||
/// </summary>
|
||
public void Configure(IServiceSettingsService service, ISceneFlowService injectedSceneFlow = null)
|
||
{
|
||
settings = service;
|
||
sceneFlow = injectedSceneFlow ?? sceneFlow;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сохраняет настройки.
|
||
/// </summary>
|
||
public void Save()
|
||
{
|
||
settings?.Save();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Перечитывает настройки, разрешенные для изменения через внешний JSON.
|
||
/// </summary>
|
||
public void ReloadExternalChanges()
|
||
{
|
||
settings?.ReloadExternalChanges();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Повторно применяет текущие значения настроек.
|
||
/// </summary>
|
||
public void ApplyAll()
|
||
{
|
||
settings?.ApplyAll();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сбрасывает все настройки к значениям по умолчанию.
|
||
/// </summary>
|
||
public void ResetAllToDefaults()
|
||
{
|
||
settings?.ResetAllToDefaults();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сбрасывает одну группу настроек к значениям по умолчанию.
|
||
/// </summary>
|
||
public void ResetGroupToDefaults(string groupName)
|
||
{
|
||
settings?.ResetGroupToDefaults(groupName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Открывает папку persistentDataPath с внешним JSON настроек.
|
||
/// </summary>
|
||
public void OpenPersistentDataFolder()
|
||
{
|
||
Application.OpenURL($"file://{Application.persistentDataPath}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Загружает сцену по имени.
|
||
/// </summary>
|
||
public void LoadScene(string sceneName)
|
||
{
|
||
var resolvedSceneFlow = GetSceneFlow();
|
||
if (!string.IsNullOrWhiteSpace(sceneName) && resolvedSceneFlow != null)
|
||
{
|
||
resolvedSceneFlow.LoadScene(sceneName);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращает приложение в главное меню.
|
||
/// </summary>
|
||
public void LoadMainMenu()
|
||
{
|
||
GetSceneFlow()?.OpenMainMenu();
|
||
}
|
||
|
||
private ISceneFlowService GetSceneFlow()
|
||
{
|
||
if (sceneFlow == null)
|
||
{
|
||
Debug.LogWarning($"{nameof(AppUIFacade)} requires {nameof(ISceneFlowService)} from DI.", this);
|
||
}
|
||
|
||
return sceneFlow;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Завершает приложение или останавливает Play Mode в редакторе.
|
||
/// </summary>
|
||
public void QuitApplication()
|
||
{
|
||
#if UNITY_EDITOR
|
||
UnityEditor.EditorApplication.isPlaying = false;
|
||
#else
|
||
Application.Quit();
|
||
#endif
|
||
}
|
||
}
|
||
}
|