示例
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Serialization;
using UnityEngine.Events;
using UnityEngine.EventSystems;
/// <summary>
/// 倒计时Text
/// </summary>
public class UICountdownText : MonoBehaviour
{
[SerializeField]
private Text m_Text;
[SerializeField]
private int m_RemainSecond; //剩余时间(单位:秒)
private int second;
private int minute;
private int hour;
private float startTime;
private float endTime;
private float lastTime;
private bool m_Play = false;
[Serializable]
public class OnFinishedEvent : UnityEvent { }
// 防止序列化变量重命名后丢失引用
[FormerlySerializedAs("onFinished")]
[SerializeField]
private OnFinishedEvent m_OnFinished = new OnFinishedEvent();
void Awake()
{
if (m_Text == null)
m_Text = this.GetComponent<Text>();
SetRemainSecond(m_RemainSecond);
}
void Update()
{
if (!m_Play)
return;
if (Time.time - lastTime < 1)
return;
lastTime = Time.time;
string cd = string.Empty;
if (hour > 0) {
cd = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);
}else if(minute > 0){
cd = string.Format("{0:D2}:{1:D2}", minute, second);
}else{
cd = string.Format("{0:D2}", second);
}
if (m_Text != null)
m_Text.text = cd;
CalculateTime();
if (m_RemainSecond < 0)
{
m_Play = false;
m_OnFinished.Invoke();
}
}
public void SetRemainSecond(int value)
{
m_RemainSecond = value;
startTime = Time.time;
endTime = startTime + m_RemainSecond;
m_Play = true;
CalculateTime();
}
public void SetColor(Color color)
{
if (m_Text != null)
m_Text.color = color;
}
private void CalculateTime()
{
m_RemainSecond = (int)(endTime - Time.time);
second = m_RemainSecond % 60;
minute = (m_RemainSecond / 60) % 60;
hour = (m_RemainSecond / 3600);
}
}