using UnityEngine; using TMPro; [RequireComponent(typeof(TMP_Text))] public class ResourceUIText : MonoBehaviour { public ResourceType resourceType; [Tooltip("Сокращать большие числа (1200 -> 1.2K, 1500000 -> 1.5M), как на референсе HUD")] public bool useShortFormat = true; private TMP_Text label; void Awake() { label = GetComponent(); } void OnEnable() { // Ждём, пока ResourceManager точно проинициализируется (Awake порядок не гарантирован) if (ResourceManager.Instance != null) { Subscribe(); } else { Invoke(nameof(TrySubscribeDelayed), 0.1f); } } void TrySubscribeDelayed() { if (ResourceManager.Instance != null) Subscribe(); } void Subscribe() { ResourceManager.Instance.OnResourceChanged += HandleResourceChanged; // сразу показать текущее значение при старте, не дожидаясь первого изменения UpdateText(ResourceManager.Instance.GetResource(resourceType)); } void OnDisable() { if (ResourceManager.Instance != null) ResourceManager.Instance.OnResourceChanged -= HandleResourceChanged; } void HandleResourceChanged(ResourceType type, float newValue) { if (type != resourceType) return; // реагируем только на "свой" ресурс UpdateText(newValue); } void UpdateText(float value) { label.text = useShortFormat ? FormatShort(value) : Mathf.FloorToInt(value).ToString(); } string FormatShort(float value) { if (value >= 1_000_000f) return (value / 1_000_000f).ToString("0.#") + "M"; if (value >= 1_000f) return (value / 1_000f).ToString("0.#") + "K"; return Mathf.FloorToInt(value).ToString(); } }