Files

72 lines
2.0 KiB
C#

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<TMP_Text>();
}
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();
}
}