72 lines
2.0 KiB
C#
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();
|
|
}
|
|
}
|