NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/GameWrapper/Premium/PremiumRemainingDaysUI.cs

81 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Framework;
using System;
using TMPro;
using UnityEngine;
/// <summary>
/// 控制高级账户剩余天数UI的显示和更新
/// </summary>
public class PremiumRemainingDaysUI : MonoBehaviour
{
[Header("显示剩余天数的文本组件")]
[SerializeField] private TextMeshProUGUI remainingDaysText;
private void OnEnable()
{
EventManager.Instance.Register<PremiumStatusChangedEvent>(EventManager.EventName.PremiumStatusRefresh, OnPremiumStatusChanged);
EventManager.Instance.Send(EventManager.EventName.RequestPremiumStatus);
}
private void OnDisable()
{
EventManager.Instance.Unregister<PremiumStatusChangedEvent>(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));
}
}
/// <summary>
/// 每日自动更新的函数
/// </summary>
private void UpdateDaily()
{
// 重新请求一下最新状态,保证数据准确性,并重新安排下一次更新
EventManager.Instance.Send(EventManager.EventName.RequestPremiumStatus);
}
/// <summary>
/// 根据剩余时间更新UI
/// </summary>
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);
}
}
}