1 using System;
2 using UnityEngine;
3
4 public enum ETimerType
5 {
6 CommonFormat, // 78 77 76 75 ...
7 TimeFormat, //以时间格式显示倒计时
8 }
9
10 //自定义时间
11 public class CustomTime
12 {
13 public int Days, Hours, Minutes, Seconds;
14
15 public CustomTime(int seconds)
16 {
17 Days = seconds / 86400;
18
19 seconds = seconds - Days * 86400;
20 Hours = seconds / 3600;
21
22 seconds = seconds - Hours * 3600;
23 Minutes = seconds / 60;
24
25 Seconds = seconds % 60;
26 }
27
28 public string GetTimeFormat()
29 {
30 string formatTime = "";
31 if (Days > 0)
32 {
33 formatTime = string.Format("{0}天{1}:{2}:{3}", Days.ToString(), Hours.ToString("D2"), Minutes.ToString("D2"), Seconds.ToString("D2"));
34 }
35 else if (Hours > 0)
36 {
37 formatTime = string.Format("{0}:{1}:{2}", Hours.ToString("D2"), Minutes.ToString("D2"), Seconds.ToString("D2"));
38 }
39 else if (Minutes > 0)
40 {
41 formatTime = string.Format("{0}:{1}", Minutes.ToString("D2"), Seconds.ToString("D2"));
42 }
43 else if (Seconds > 0)
44 {
45 formatTime = string.Format("{0}", Seconds.ToString("D2"));
46 }
47 return formatTime;
48 }
49 }
50
51 [RequireComponent(typeof(UILabel))]
52 public class LabelTimer : MonoBehaviour
53 {
54 public delegate void OnFinish();
55 public event OnFinish EvFinish;
56
57 public int totalTime = 0;
58 public float interval = 0;
59
60 ETimerType timerType = ETimerType.CommonFormat;
61 UILabel mLabel = null;
62
63 void Start()
64 {
65 mLabel = GetComponent<UILabel>();
66 }
67
68 void Update()
69 {
70 interval += Time.deltaTime;
71 if (interval >= 1)
72 {
73 --totalTime;
74 ShowTime();
75 interval = 0;
76 }
77
78 if (totalTime <= 0)
79 {
80 enabled = false;
81 gameObject.SetActive(false);
82 if (null != EvFinish)
83 EvFinish();
84 }
85 }
86
87 void ShowTime()
88 {
89 if (timerType == ETimerType.CommonFormat)
90 {
91 mLabel.text = totalTime.ToString();
92 }
93 else if (timerType == ETimerType.TimeFormat)
94 {
95 CustomTime ct = new CustomTime(totalTime);
96 mLabel.text = ct.GetTimeFormat();
97 }
98 }
99
100 public void Stop()
101 {
102 gameObject.SetActive(false);
103 totalTime = 0;
104 EvFinish = null;
105 }
106
107 public bool TimeKeeping
108 {
109 get
110 {
111 return totalTime > 0;
112 }
113 }
114
115 public void StartCountDown(int totalTime, ETimerType timerType)
116 {
117 this.timerType = timerType;
118 if (null == mLabel)
119 mLabel = GetComponent<UILabel>();
120 this.totalTime = totalTime;
121 interval = 0;
122 enabled = true;
123 ShowTime();
124 if (!gameObject.activeSelf)
125 gameObject.SetActive(true);
126 }
127
128 public static LabelTimer Begin(GameObject go, int totalTime, ETimerType timerType = ETimerType.CommonFormat)
129 {
130 LabelTimer lt = go.GetComponent<LabelTimer>();
131 if (null == lt) lt = go.AddComponent<LabelTimer>();
132 lt.StartCountDown(totalTime, timerType);
133 return lt;
134 }
135 }