【Unity3D日常開發】Unity3D中實現計時器工具類-正計時、倒計時、暫停計時、加速計時
推薦閱讀
CSDN主頁
GitHub開源地址
Unity3D插件分享
簡書地址
我的個人博客
QQ群:1040082875
大家好,我是佛系工程師
☆恬靜的小魔龍☆
,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。
一、前言
最近要實現個小功能:計時器。
計時器的用處很多,比如說在游戲開發中顯示技能CD、buff持續時間、控制眩暈等狀態的持續時間。
計時器的主要功能有:
在規定時間內倒計時
顯示倒計時時間
顯示正計時時間
暫停、繼續
時間速率影響
獲取倒計時剩余時間
倒計時結束的回調
話說大樹底下好乘涼,在有大佬的代碼就是方便很多,找了一篇大佬寫好的代碼:
鏈接:unity計時器功能的實現
在實際使用中修改了一部分代碼,將更加便捷使用,將修改后的代碼分享給出來。
二、實現計時器
2-1、計時器實現
新建腳本,命名為Timer.cs:
using UnityEngine; public delegate void CompleteEvent(); public delegate void UpdateEvent(float t); public class Timer : MonoBehaviour { UpdateEvent updateEvent; CompleteEvent onCompleted; bool isLog = true;//是否打印消息 float timeTarget; // 計時時間/ float timeStart; // 開始計時時間/ float offsetTime; // 計時偏差/ bool isTimer; // 是否開始計時/ bool isDestory = true; // 計時結束后是否銷毀/ bool isEnd; // 計時是否結束/ bool isIgnoreTimeScale = true; // 是否忽略時間速率 bool isRepeate; //是否重復 float now; //當前時間 正計時 float downNow; //倒計時 bool isDownNow = false; //是否是倒計時 // 是否使用游戲的真實時間 不依賴游戲的時間速度 float TimeNow { get { return isIgnoreTimeScale ? Time.realtimeSinceStartup : Time.time; } } ///
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
調用的計時器的腳本Test.cs:
using UnityEngine; using System.Collections; using System; public class Test : MonoBehaviour { void Start() { // 創建計時器 Timer timer = Timer.createTimer("GameTime"); //開始計時 timer.startTiming(10, true, OnComplete, OnProcess); } // 計時結束的回調 void OnComplete() { Debug.Log("計時完成"); } // 計時器的進程 void OnProcess(float p) { Debug.Log(FormatTime(p)); } ///
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2-2、測試倒計時
將Test.cs腳本附到場景中任意對象上,運行程序,測試倒計時:
3-3、測試正計時
修改代碼,測試正計時:
void Start() { // 創建計時器 Timer timer = Timer.createTimer("GameTime"); //開始計時 timer.startTiming(10, false, OnComplete, OnProcess); }
1
2
3
4
5
6
7
運行結果:
3-4、測試獲取剩余時間
修改代碼:
using UnityEngine; using System.Collections; using System; public class Test : MonoBehaviour { Timer timer; void Start() { // 創建計時器 timer = Timer.createTimer("GameTime"); //開始計時 timer.startTiming(10, true); } void Update() { Debug.Log(timer.GetTimeNow()); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
這次不使用回調函數,直接使用Update去獲取剩余時間,運行結果:
3-5、測試暫停和繼續
繼續修改代碼:
using UnityEngine; using System.Collections; using System; public class Test : MonoBehaviour { Timer timer; void Start() { // 創建計時器 timer = Timer.createTimer("GameTime"); //開始計時 timer.startTiming(10, true, OnComplete, OnProcess); } void Update() { if (Input.GetKeyDown(KeyCode.W)) { Debug.Log("暫停"); timer.pauseTimer();//暫停 } if (Input.GetKeyDown(KeyCode.S)) { Debug.Log("繼續"); timer.connitueTimer();//繼續 } if (Input.GetKeyDown(KeyCode.A)) { Debug.Log("重新計時"); timer.reStartTimer();//重新計時 } if (Input.GetKeyDown(KeyCode.D)) { Debug.Log("更改目標時間:20"); timer.changeTargetTime(20);//更改目標時間 } } // 計時結束的回調 void OnComplete() { Debug.Log("計時完成"); } // 計時器的進程 void OnProcess(float p) { Debug.Log(FormatTime(p)); } ///
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
運行程序:
3-6、測試游戲加速
修改代碼后:
using UnityEngine; using System.Collections; using System; public class Test : MonoBehaviour { Timer timer; void Start() { Time.timeScale = 2;//游戲加速 // 創建計時器 timer = Timer.createTimer("GameTime"); //開始計時 timer.startTiming(60, true, OnComplete, OnProcess, false); } // 計時結束的回調 void OnComplete() { Debug.Log("計時完成"); } // 計時器的進程 void OnProcess(float p) { Debug.Log(FormatTime(p)); } ///
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
運行程序,不忽略游戲加速:
運行程序,忽略游戲加速:
三、后記
你的就是對博主的支持,有問題記得留言:
博主主頁有聯系方式。
博主還有跟多寶藏文章等待你的發掘哦:
5G游戲 unity
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。