Подробный список изменений: - Перенесены эффекты частиц из 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-индекс проекта.
95 lines
2.7 KiB
C#
95 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using Zenject;
|
|
|
|
namespace DanroJump.Settings
|
|
{
|
|
/// <summary>
|
|
/// Инжектит сценовые AppUIFacade из ProjectContext без прямого глобального поиска объектов.
|
|
/// </summary>
|
|
public sealed class AppUIFacadeInjector : IInitializable, IDisposable
|
|
{
|
|
private readonly DiContainer container;
|
|
private readonly bool injectActionsInScene;
|
|
private readonly List<GameObject> rootObjects = new();
|
|
private readonly List<AppUIFacade> actions = new();
|
|
private readonly HashSet<EntityId> injectedEntityIds = new();
|
|
|
|
public AppUIFacadeInjector(DiContainer container, bool injectActionsInScene)
|
|
{
|
|
this.container = container;
|
|
this.injectActionsInScene = injectActionsInScene;
|
|
}
|
|
|
|
public void Initialize()
|
|
{
|
|
if (!injectActionsInScene)
|
|
{
|
|
return;
|
|
}
|
|
|
|
InjectLoadedScenes();
|
|
SceneManager.sceneLoaded += OnSceneLoaded;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
rootObjects.Clear();
|
|
actions.Clear();
|
|
injectedEntityIds.Clear();
|
|
}
|
|
|
|
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
{
|
|
InjectScene(scene);
|
|
}
|
|
|
|
private void InjectLoadedScenes()
|
|
{
|
|
for (var index = 0; index < SceneManager.sceneCount; index++)
|
|
{
|
|
InjectScene(SceneManager.GetSceneAt(index));
|
|
}
|
|
}
|
|
|
|
private void InjectScene(Scene scene)
|
|
{
|
|
if (!scene.IsValid() || !scene.isLoaded)
|
|
{
|
|
return;
|
|
}
|
|
|
|
rootObjects.Clear();
|
|
scene.GetRootGameObjects(rootObjects);
|
|
|
|
for (var rootIndex = 0; rootIndex < rootObjects.Count; rootIndex++)
|
|
{
|
|
actions.Clear();
|
|
rootObjects[rootIndex].GetComponentsInChildren(true, actions);
|
|
|
|
for (var actionIndex = 0; actionIndex < actions.Count; actionIndex++)
|
|
{
|
|
var sceneActions = actions[actionIndex];
|
|
if (sceneActions == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!injectedEntityIds.Add(sceneActions.GetEntityId()))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
container.Inject(sceneActions);
|
|
}
|
|
}
|
|
|
|
actions.Clear();
|
|
rootObjects.Clear();
|
|
}
|
|
}
|
|
}
|