Подробные изменения: - Добавлены и доработаны модальные окна главного меню, сервисные настройки, шаблоны UI Toolkit и единый scene-flow сервис для переходов между сценами. - Расширена gameplay-архитектура: сессия забега, HUD, спавн контента платформ, collectible-предметы, оборудование, хрупкие и движущиеся платформы. - Добавлена база противников: типы спавна, патрулирование, процедурный спавнер, правила размещения через ScriptableObject-сложности и убийство врагов прыжком сверху. - Исправлены смерть и respawn игрока, финальный GameOver, отскоки от врагов, пружин и boost-предметов, а также проход сквозь врагов при усиленном подъеме. - Проведен рефакторинг взаимодействия систем: общий landing context, единые правила player-contact, NonLazy gameplay session, fail-fast installer и централизованный выбор точек спавна. - Обновлены сцены, prefab-ассеты, difficulty stages, ресурсы главного меню, настройки проекта, roadmap и аппаратная COM-интеграция. - Добавлены ассеты летучей мыши, врагов, collectibles, TextMesh Pro, ProjectContext и gameplay UI. Проверки: - dotnet build .\\Assembly-CSharp.csproj --no-restore - Unity validation ключевых gameplay/UI/scene-flow скриптов - Unity Console после force refresh без ошибок
136 lines
4.0 KiB
C#
136 lines
4.0 KiB
C#
using UnityEngine;
|
||
using Zenject;
|
||
using DanroJump.SceneFlow;
|
||
|
||
namespace DanroJump.Settings
|
||
{
|
||
/// <summary>
|
||
/// MonoBehaviour-фасад для вызова действий сервиса настроек из UI/Unity Events.
|
||
/// </summary>
|
||
public sealed class ServiceSettingsActions : MonoBehaviour
|
||
{
|
||
private IServiceSettingsService settings;
|
||
private ISceneFlowService sceneFlow;
|
||
private bool ownsSceneFlow;
|
||
|
||
/// <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)
|
||
{
|
||
settings = service;
|
||
}
|
||
|
||
/// <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)
|
||
{
|
||
if (!string.IsNullOrWhiteSpace(sceneName))
|
||
{
|
||
GetSceneFlow().LoadScene(sceneName);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращает приложение в главное меню.
|
||
/// </summary>
|
||
public void LoadMainMenu()
|
||
{
|
||
GetSceneFlow().OpenMainMenu();
|
||
}
|
||
|
||
private ISceneFlowService GetSceneFlow()
|
||
{
|
||
if (sceneFlow != null)
|
||
{
|
||
return sceneFlow;
|
||
}
|
||
|
||
sceneFlow = new SceneFlowService();
|
||
ownsSceneFlow = true;
|
||
return sceneFlow;
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if (ownsSceneFlow && sceneFlow is System.IDisposable disposable)
|
||
{
|
||
disposable.Dispose();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Завершает приложение или останавливает Play Mode в редакторе.
|
||
/// </summary>
|
||
public void QuitApplication()
|
||
{
|
||
#if UNITY_EDITOR
|
||
UnityEditor.EditorApplication.isPlaying = false;
|
||
#else
|
||
Application.Quit();
|
||
#endif
|
||
}
|
||
}
|
||
}
|