using UnityEngine; using System.Text; using UnityEngine.UI; using TMPro; namespace UI { // Компонент показывает информационную плашку при одновременном нажатии комбинации кнопок // Комбинация по умолчанию: Fire = action1, Turn = turn1, Up = up1, Down = down1 // Поведение: если holdToShow == true — плашка видна пока комбинация удерживается; // если false — комбинация переключает видимость (toggle). public class FastCheckController : MonoBehaviour { [Header("Keys (can be overridden in inspector)")] public ButtonPinMapping fire = ButtonPinMapping.action1; public ButtonPinMapping turnLeft = ButtonPinMapping.turnLeft1; public ButtonPinMapping turnRight = ButtonPinMapping.turnRight1; public ButtonPinMapping up = ButtonPinMapping.up1; public ButtonPinMapping down = ButtonPinMapping.down1; [Header("UI")] public GameObject panelRoot; public TextMeshProUGUI infoTextTMP; public Text infoText; [Header("Behavior")] public bool holdToShow = true; [Tooltip("Minimal seconds between toggles to avoid bounce")] public float debounceSeconds = 0.05f; // Ключи статистики используются из PrizeSystem (PrizeSystem.key_starts и т.д.) bool comboPrev; // default initialization removed to satisfy style warnings float lastToggleTime = -10f; // Кэш флага настройки "Быстрая проверка" — обновляется по событию настроек bool fastCheckEnabled; // Кэш флага проверки наличия приза bool prizeAvailabilityEnabled; private void Start() { // Подождать, если SettingsManager ещё не инициализирован if (SettingsManager.instance == null) { StartCoroutine(WaitForSettingsAndInit()); } else { Init(); } if (panelRoot != null) panelRoot.SetActive(false); } System.Collections.IEnumerator WaitForSettingsAndInit() { while (SettingsManager.instance == null) yield return null; Init(); } void Init() { // Подписка на изменения настроек SettingsManager.instance.OnSettingsChanged.AddListener(RefreshContent); // Подписываемся также, чтобы обновлять локальный флаг при изменении настроек SettingsManager.instance.OnSettingsChanged.AddListener(UpdateFastCheckFlag); // Инициализируем флаг и содержимое UpdateFastCheckFlag(); RefreshContent(); } private void OnDestroy() { if (SettingsManager.instance != null) { SettingsManager.instance.OnSettingsChanged.RemoveListener(RefreshContent); SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateFastCheckFlag); } } void Update() { // Используем кэшированный флаг, обновляемый по событию настроек // Если режим быстрого контроля отключён — ничего не делаем и скрываем плашку if (!fastCheckEnabled) { if (panelRoot != null && panelRoot.activeSelf) panelRoot.SetActive(false); comboPrev = false; return; } // Используем In.GetButton чтобы корректно детектировать одновременные нажатия bool aTurn = In.GetButton(turnLeft) || In.GetButton(turnRight); bool aFire = In.GetButton(fire); bool aUp = In.GetButton(up); bool aDown = In.GetButton(down); bool comboNow = aTurn && aFire && (aUp || aDown); // rising edge if (!comboPrev && comboNow) { // предотвратить частые переключения if (Time.unscaledTime - lastToggleTime > debounceSeconds) { if (holdToShow) { Show(); } else { Toggle(); } lastToggleTime = Time.unscaledTime; } } // если режим hold, скрываем при отпускании комбинации if (holdToShow && comboPrev && !comboNow) { if (Time.unscaledTime - lastToggleTime > debounceSeconds) { Hide(); lastToggleTime = Time.unscaledTime; } } comboPrev = comboNow; } void Toggle() { if (panelRoot == null) return; bool newState = !panelRoot.activeSelf; // Используем кэшированный флаг вместо запроса настроек каждый раз if (newState && !fastCheckEnabled) return; panelRoot.SetActive(newState); if (newState) RefreshContent(); } void Show() { if (panelRoot == null) return; // Показываем только если в настройках разрешено (кэш) if (!fastCheckEnabled) return; panelRoot.SetActive(true); RefreshContent(); } void Hide() { if (panelRoot == null) return; panelRoot.SetActive(false); } public void RefreshContent() { if (panelRoot == null) return; // Обновляем только когда плашка видна if (!panelRoot.activeSelf) return; // Дополнительная гарантия: если в настройках отключено — скрыть плашку и не показывать данные if (!fastCheckEnabled) { if (panelRoot.activeSelf) panelRoot.SetActive(false); return; } var sb = new StringBuilder(); // Читаем (по умолчанию 0 если ключа нет) через PrizeSystem int starts = PlayerPrefs.GetInt(PrizeSystem.key_starts, 0); int startsNul = PlayerPrefs.GetInt(PrizeSystem.key_startsNul, 0); int prizes = PlayerPrefs.GetInt(PrizeSystem.key_prizesgiven, 0); int prizesNul = PlayerPrefs.GetInt(PrizeSystem.key_prizesgivenNul, 0); sb.AppendLine("Игровая статистика:"); // При включённой проверке наличия приза показываем доступное количество призов sb.AppendLine($"Счетчик призов (глобальный): {prizes}"); sb.AppendLine($"Счетчик призов (обнуляемый): {prizesNul}"); sb.AppendLine($"Внесено монет (глобальный): {starts}"); sb.AppendLine($"Внесено монет (обнуляемый): {startsNul}"); if (prizeAvailabilityEnabled) { int prizesCount = PlayerPrefs.GetInt(KeyVault.PRIZES_AVAILABLE, 0); sb.AppendLine($"Доступных призов: {prizesCount}"); } ApplyText(sb.ToString()); } // Обработчик изменения настроек: обновляет кэшированный флаг и прячет/обновляет панель при необходимости void UpdateFastCheckFlag() { fastCheckEnabled = IsFastCheckEnabled(); // обновляем флаг проверки наличия приза prizeAvailabilityEnabled = GetSettingFlag("Быстрая проверка наличия приза"); if (!fastCheckEnabled && panelRoot != null && panelRoot.activeSelf) { panelRoot.SetActive(false); } else if (fastCheckEnabled && panelRoot != null && panelRoot.activeSelf) { // если флаг включили и панель уже открыта — обновим контент RefreshContent(); } } // Проверяет, включена ли настройка "Быстрая проверка" в SettingsManager bool IsFastCheckEnabled() { return GetSettingFlag("Быстрая проверка"); } // Универсальная проверка булевых настроек (читает значение и сравнивает со списком разрешающих значений) bool GetSettingFlag(string settingName) { if (SettingsManager.instance == null) return false; string val; try { val = SettingsManager.instance.GetSettingValue(settingName); } catch (System.Exception ex) { Debug.LogWarning($"FastCheckController: ошибка при чтении настройки '{settingName}': {ex.Message}"); return false; } if (string.IsNullOrEmpty(val)) return false; val = val.Trim().ToLowerInvariant(); // Разрешающие значения (русские и английские варианты) string[] trueValues = new string[] { "вкл", "включено", "включать", "включить", "включена", "да", "true", "on", "enabled", "вкл." }; foreach (var t in trueValues) { if (val.Contains(t)) return true; } return false; } void ApplyText(string text) { if (infoTextTMP != null) infoTextTMP.text = text; else if (infoText != null) infoText.text = text; else Debug.Log(text); } } }