using UnityEngine; using System.Collections; using System; public class ResourceCollector : MonoBehaviour { [Header("Что производит это здание")] public ResourceType resourceType; [Tooltip("База награды за клик (используется для расчета множителя уровня)")] public float amountPerClick = 10f; [Header("Параметры хранилища")] [Tooltip("Максимальная вместимость")] public float maxCapacity = 100f; [Tooltip("Текущий запас (меняется автоматически)")] public float currentStock = 0f; [Header("Уровень здания")] public int level = 1; public float perLevelMultiplier = 1.2f; private ResourceManager _manager; private bool isRecharging = false; void Awake() { _manager = ResourceManager.Instance; if (_manager == null) { Debug.LogError($"{gameObject.name}: ResourceManager не найден!"); enabled = false; return; } currentStock = 0f; } // НОВЫЙ МЕТОД: Чтобы UI мог спрашивать: "Сколько там сейчас?" public float GetCurrentStock() { return currentStock; } public float GetMaxCapacity() { return maxCapacity; } void OnMouseDown() { // Если уже идёт восстановление — ничего не делаем if (isRecharging) { Debug.Log($"[КЛИК] {gameObject.name}: уже идёт восстановление, ждём."); return; } // Если запас есть — забираем ресурсы if (currentStock > 0) { float finalAmount = amountPerClick * Mathf.Pow(perLevelMultiplier, level - 1); float reward = currentStock; // берём всё, что накопилось _manager.AddResource(resourceType, reward); currentStock = 0f; Debug.Log($"[СБОР] Получено {reward:F1} {resourceType}. Запас сброшен в 0."); // Сразу запускаем восстановление после сбора if (!isRecharging) { StartCoroutine(RechargeRoutine()); } } else { // Если запаса нет и восстановление ещё не запущено — запускаем его Debug.Log($"[КЛИК] {gameObject.name} пуст, запускаем восстановление."); if (!isRecharging) { StartCoroutine(RechargeRoutine()); } } } System.Collections.IEnumerator RechargeRoutine() { if (isRecharging) yield break; isRecharging = true; float rechargeRate = 5f; // единиц в секунду float timeToFill = (maxCapacity - currentStock) / rechargeRate; float elapsed = 0f; while (elapsed < timeToFill) { elapsed += Time.deltaTime; float progress = Mathf.Clamp01(elapsed / timeToFill); currentStock = Mathf.Lerp(currentStock, maxCapacity, progress); yield return null; } currentStock = maxCapacity; isRecharging = false; Debug.Log($"[ГОТОВО] {gameObject.name} полностью заполнен!"); } public void Upgrade() { level++; Debug.Log($"[АПГРЕЙД] Уровень {level}"); } }