Подробные изменения: - Добавлены и доработаны модальные окна главного меню, сервисные настройки, шаблоны 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 без ошибок
68 lines
2.2 KiB
C#
68 lines
2.2 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace DanroJump.Settings
|
||
{
|
||
/// <summary>
|
||
/// ScriptableObject-база всех операторских настроек проекта.
|
||
/// </summary>
|
||
[CreateAssetMenu(
|
||
fileName = "ServiceSettingsDatabase",
|
||
menuName = "Danro Jump/Settings/Service Settings Database")]
|
||
public sealed class ServiceSettingsDatabase : ScriptableObject
|
||
{
|
||
[SerializeField] private List<ServiceSettingDefinition> entries = new();
|
||
|
||
/// <summary>
|
||
/// Все описания сервисных настроек в порядке отображения.
|
||
/// </summary>
|
||
public IReadOnlyList<ServiceSettingDefinition> Entries => entries;
|
||
|
||
/// <summary>
|
||
/// Находит описание настройки по ключу.
|
||
/// </summary>
|
||
public ServiceSettingDefinition Find(string key)
|
||
{
|
||
return entries.Find(entry =>
|
||
entry != null &&
|
||
string.Equals(entry.Key, key, StringComparison.Ordinal));
|
||
}
|
||
|
||
/// <summary>
|
||
/// Безопасно пытается найти настройку по ключу.
|
||
/// </summary>
|
||
public bool TryFind(string key, out ServiceSettingDefinition definition)
|
||
{
|
||
definition = Find(key);
|
||
return definition != null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверяет пустые и дублирующиеся ключи в редакторе.
|
||
/// </summary>
|
||
private void OnValidate()
|
||
{
|
||
var keys = new HashSet<string>();
|
||
foreach (var entry in entries)
|
||
{
|
||
if (entry == null)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(entry.Key))
|
||
{
|
||
Debug.LogWarning($"[{nameof(ServiceSettingsDatabase)}] Empty key in {name}.", this);
|
||
continue;
|
||
}
|
||
|
||
if (!keys.Add(entry.Key))
|
||
{
|
||
Debug.LogWarning($"[{nameof(ServiceSettingsDatabase)}] Duplicate key '{entry.Key}' in {name}.", this);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|