using Framework; using System; using TMPro; using UnityEngine; /// /// 控制高级账户剩余天数UI的显示和更新 /// public class PremiumRemainingDaysUI : MonoBehaviour { [Header("显示剩余天数的文本组件")] [SerializeField] private TextMeshProUGUI remainingDaysText; private void OnEnable() { EventManager.Instance.Register(EventManager.EventName.PremiumStatusRefresh, OnPremiumStatusChanged); EventManager.Instance.Send(EventManager.EventName.RequestPremiumStatus); } private void OnDisable() { EventManager.Instance.Unregister(EventManager.EventName.PremiumStatusRefresh, OnPremiumStatusChanged); CancelInvoke(nameof(UpdateDaily)); } private void OnPremiumStatusChanged(PremiumStatusChangedEvent eventData) { if (eventData.IsActivated && eventData.ExpirationTimestamp > 0) { gameObject.transform.localScale = Vector3.one; UpdateRemainingDays(eventData.RemainingSeconds); // 为了防止重复调用,先取消之前的 CancelInvoke(nameof(UpdateDaily)); // 安排一个每日更新任务,在第二天的零点过1秒后触发 DateTime now = DateTime.Now; DateTime tomorrow = now.AddDays(1).Date; double secondsUntilTomorrow = (tomorrow - now).TotalSeconds; Invoke(nameof(UpdateDaily), (float)secondsUntilTomorrow + 1); } else { gameObject.transform.localScale = Vector3.zero; CancelInvoke(nameof(UpdateDaily)); } } /// /// 每日自动更新的函数 /// private void UpdateDaily() { // 重新请求一下最新状态,保证数据准确性,并重新安排下一次更新 EventManager.Instance.Send(EventManager.EventName.RequestPremiumStatus); } /// /// 根据剩余时间(秒)更新UI /// private void UpdateRemainingDays(long remainingSeconds) { if (remainingDaysText == null) return; TimeSpan remainingTime = TimeSpan.FromSeconds(remainingSeconds); // 向上取整,例如剩余1.1天,也算作2天。如果小于0则为0。 int days = Math.Max(0, (int)Math.Ceiling(remainingTime.TotalDays)); int hours = remainingTime.Hours; if (days > 0) { remainingDaysText.text = StringManager.Instance.GetLocalizeTextByKeyAndParams("PremiumPerk_Remain_Day", days); } else { remainingDaysText.text = StringManager.Instance.GetLocalizeTextByKeyAndParams("PremiumPerk_Remain_Hour", hours); } } }