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