using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using ZXKFramework;
namespace YiLiao.XinFeiTingZhen
{
public class CountdownPanel : UIBase
{
[Tooltip("倒计时总时长(秒)")]
public float duration = 20f;
[Tooltip("绑定带有Filled属性的Image组件")]
public Image countdownImage;
[Tooltip("绑定显示时间的Text组件")]
public Text timeText;
// 用于存储协程引用,以便随时停止
private Coroutine countdownCoroutine;
public Action callBack;
public override string GroupName => "CountdownPanel";
public override string Name => "CountdownPanel";
///
/// 启动倒计时
///
public void StartCountdown(Action callBack)
{
this.callBack = callBack;
// 如果已经有倒计时在运行,先停止旧的
if (countdownCoroutine != null)
{
StopCoroutine(countdownCoroutine);
}
// 启动新的协程
countdownCoroutine = StartCoroutine(CountdownRoutine());
}
///
/// 关闭/停止倒计时
///
public void StopCountdown()
{
if (countdownCoroutine != null)
{
StopCoroutine(countdownCoroutine);
countdownCoroutine = null;
}
Debug.Log("倒计时已关闭");
}
///
/// 倒计时协程
///
private IEnumerator CountdownRoutine()
{
float elapsedTime = 0f;
// 循环直到时间耗尽
while (elapsedTime < duration)
{
// 计算剩余时间
float remainingTime = duration - elapsedTime;
// 更新UI
UpdateTimerUI(remainingTime);
// 累加时间
elapsedTime += Time.deltaTime;
// 等待一帧
yield return null;
}
// 倒计时结束,确保显示为0
UpdateTimerUI(0);
Debug.Log("倒计时结束!");
callBack?.Invoke();
// 协程结束,清空引用
countdownCoroutine = null;
}
void UpdateTimerUI(float time = 0)
{
// 防止除以0或负数导致的UI错误
float fill = duration > 0 ? time / duration : 0;
countdownImage.fillAmount = fill;
int seconds = Mathf.CeilToInt(time);
timeText.text = seconds.ToString() + "s";
}
public override void Hide()
{
base.Hide();
StopCountdown();
}
}
}