Danro-Jump/Assets/Scripts/Runtime/Settings/Core/AddressableServiceSettingsDatabaseProvider.cs
Danil Iarosh 1f6884c5ac Build gameplay systems and service settings
Подробные изменения:
- Добавлены и доработаны модальные окна главного меню, сервисные настройки, шаблоны 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 без ошибок
2026-05-27 16:34:51 +03:00

92 lines
3.1 KiB
C#

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace DanroJump.Settings
{
/// <summary>
/// Загружает базу сервисных настроек из прямой ссылки или через Addressables.
/// </summary>
public sealed class AddressableServiceSettingsDatabaseProvider : IServiceSettingsDatabaseProvider
{
private readonly string address;
private readonly ServiceSettingsDatabase fallbackDatabase;
private AsyncOperationHandle<ServiceSettingsDatabase>? loadedHandle;
/// <summary>
/// Создает provider для addressable-базы настроек.
/// </summary>
public AddressableServiceSettingsDatabaseProvider(
string address,
ServiceSettingsDatabase fallbackDatabase = null)
{
this.address = address;
this.fallbackDatabase = fallbackDatabase;
}
/// <summary>
/// Возвращает прямую fallback-базу без блокировки Addressables или загружает базу по адресу.
/// </summary>
public ServiceSettingsDatabase Load()
{
ReleaseLoadedHandle();
if (fallbackDatabase != null)
{
return fallbackDatabase;
}
if (string.IsNullOrWhiteSpace(address))
{
return null;
}
try
{
var handle = Addressables.LoadAssetAsync<ServiceSettingsDatabase>(address);
var database = handle.WaitForCompletion();
// Удерживаем handle только для успешно загруженного addressable-asset.
if (handle.Status == AsyncOperationStatus.Succeeded && database != null)
{
loadedHandle = handle;
return database;
}
if (handle.IsValid())
{
Addressables.Release(handle);
}
Debug.LogWarning(
$"[{nameof(AddressableServiceSettingsDatabaseProvider)}] Failed to load settings database at address '{address}'. Fallback will be used.");
}
catch (System.Exception exception)
{
Debug.LogWarning(
$"[{nameof(AddressableServiceSettingsDatabaseProvider)}] Failed to load settings database at address '{address}': {exception.Message}");
}
return null;
}
/// <summary>
/// Освобождает addressable-handle, если база была загружена через Addressables.
/// </summary>
public void Dispose()
{
ReleaseLoadedHandle();
}
private void ReleaseLoadedHandle()
{
if (loadedHandle.HasValue && loadedHandle.Value.IsValid())
{
Addressables.Release(loadedHandle.Value);
}
loadedHandle = null;
}
}
}