using UnityEngine; using RR.Common.Controls; using RR.Common.Settings; using RR.Game2D.Core.Managers; namespace RR.Game2D.Behaviour { /// /// Компонент финиша уровня с возможностью выдачи маленького приза. /// Устанавливается на объект с триггером и тегом "Finish". /// [RequireComponent(typeof(Collider2D))] public class LevelFinish : MonoBehaviour { [Header("Настройки приза")] [Tooltip("Включить выдачу приза при завершении уровня")] [SerializeField] private bool enablePrizeOnFinish = true; [Tooltip("Ключ настройки для проверки включения выдачи призов (если пусто - не проверяется)")] [SerializeField] private string prizeEnabledSettingKey = "prizes.giveSmallPrize"; [Tooltip("Задержка перед выдачей приза (в секундах)")] [SerializeField] private float prizeDelay = 0.5f; [Header("Отладка")] [SerializeField] private bool debugMode; private bool _prizeGiven; private void OnTriggerEnter2D(Collider2D collision) { // Проверяем, что это игрок if (!collision.CompareTag("Player")) return; // Пытаемся выдать приз TryGivePrize(); // Переход на следующий уровень GameManager.Instance.NextLevel(); } /// /// Пытается выдать приз игроку, если выполнены все условия. /// private void TryGivePrize() { // Проверка, что приз еще не был выдан if (_prizeGiven) { if (debugMode) Debug.Log("[LevelFinish] Приз уже был выдан на этом финише."); return; } // Проверка, включена ли выдача призов в этом компоненте if (!enablePrizeOnFinish) { if (debugMode) Debug.Log("[LevelFinish] Выдача призов отключена в компоненте."); return; } // Проверка настроек (если указан ключ) if (!string.IsNullOrEmpty(prizeEnabledSettingKey)) { bool settingEnabled = SettingsManager.Instance.GetBool(prizeEnabledSettingKey); if (!settingEnabled) { if (debugMode) Debug.Log($"[LevelFinish] Выдача призов отключена в настройках ({prizeEnabledSettingKey})."); return; } } // Все проверки пройдены - выдаем приз _prizeGiven = true; if (prizeDelay > 0) { Invoke(nameof(GivePrize), prizeDelay); } else { GivePrize(); } } /// /// Выдает приз через PrizeSystemManager (учитывает флаг enableHopper). /// private void GivePrize() { if (debugMode) Debug.Log("[LevelFinish] Выдаю приз игроку!"); if (RR.Common.Managers.PrizeSystemManager.Instance != null) RR.Common.Managers.PrizeSystemManager.Instance.GivePrize(); else PrizeSystem.GivePrize(); // fallback } /// /// Сбрасывает состояние выдачи приза (для повторного использования). /// public void ResetPrize() { _prizeGiven = false; } #if UNITY_EDITOR private void OnDrawGizmos() { // Визуализация зоны финиша в редакторе Collider2D col = GetComponent(); if (col != null) { Gizmos.color = enablePrizeOnFinish ? Color.green : Color.yellow; Gizmos.DrawWireCube(col.bounds.center, col.bounds.size); } } #endif } }