1
- using System . Collections ;
1
+ using System ;
2
+ using System . Collections ;
2
3
using System . Collections . Generic ;
3
4
using UnityEngine ;
4
5
@@ -25,6 +26,17 @@ public class TypingEffect
25
26
26
27
protected bool _started ;
27
28
29
+
30
+ /// <summary>
31
+ /// 打字完成事件
32
+ /// </summary>
33
+ public Action OnComplete ;
34
+
35
+ /// <summary>
36
+ /// 打字进度变化事件
37
+ /// </summary>
38
+ public Action < float > OnProgress ;
39
+
28
40
/// <summary>
29
41
///
30
42
/// </summary>
@@ -42,16 +54,21 @@ public TypingEffect(TextField textField)
42
54
public TypingEffect ( GTextField textField )
43
55
{
44
56
if ( textField is GRichTextField )
57
+ {
45
58
_textField = ( ( RichTextField ) textField . displayObject ) . textField ;
59
+ }
46
60
else
61
+ {
47
62
_textField = ( TextField ) textField . displayObject ;
63
+ }
64
+
48
65
_textField . EnableCharPositionSupport ( ) ;
49
66
}
50
67
51
68
/// <summary>
52
69
/// 总输出次数
53
70
/// </summary>
54
- public int totalTimes
71
+ public int TotalTimes
55
72
{
56
73
get
57
74
{
@@ -60,10 +77,15 @@ public int totalTimes
60
77
for ( int i = 0 ; i < charPositions . Count - 1 ; i ++ )
61
78
{
62
79
if ( charPositions [ i ] . imgIndex > 0 ) //这是一个图片
80
+ {
63
81
times ++ ;
82
+ }
64
83
else if ( ! char . IsWhiteSpace ( _textField . parsedText [ i ] ) )
84
+ {
65
85
times ++ ;
86
+ }
66
87
}
88
+
67
89
return times ;
68
90
}
69
91
}
@@ -89,18 +111,26 @@ public void Start()
89
111
int vertCount = _textField . graphics . mesh . vertexCount ;
90
112
_backupVerts = _textField . graphics . mesh . vertices ;
91
113
if ( _vertices == null || _vertices . Length != vertCount )
114
+ {
92
115
_vertices = new Vector3 [ vertCount ] ;
116
+ }
117
+
93
118
Vector3 zero = Vector3 . zero ;
94
119
for ( int i = 0 ; i < vertCount ; i ++ )
120
+ {
95
121
_vertices [ i ] = zero ;
122
+ }
123
+
96
124
_textField . graphics . mesh . vertices = _vertices ;
97
125
98
126
//隐藏所有混排的对象
99
127
if ( _textField . richTextField != null )
100
128
{
101
129
int ec = _textField . richTextField . htmlElementCount ;
102
130
for ( int i = 0 ; i < ec ; i ++ )
131
+ {
103
132
_textField . richTextField . ShowHtmlObject ( i , false ) ;
133
+ }
104
134
}
105
135
106
136
int charCount = _textField . charPositions . Count ;
@@ -128,38 +158,48 @@ public void Start()
128
158
public bool Print ( )
129
159
{
130
160
if ( ! _started )
161
+ {
131
162
return false ;
163
+ }
132
164
133
- TextField . CharPosition cp ;
134
165
List < TextField . CharPosition > charPositions = _textField . charPositions ;
135
166
int listCnt = charPositions . Count ;
136
167
137
168
while ( _printIndex < listCnt - 1 ) //最后一个是占位的,无效的,所以-1
138
169
{
139
- cp = charPositions [ _printIndex ++ ] ;
170
+ var cp = charPositions [ _printIndex ++ ] ;
140
171
if ( cp . vertCount > 0 )
141
- output ( cp . vertCount ) ;
172
+ {
173
+ Output ( cp . vertCount ) ;
174
+ }
175
+
176
+ // 更新进度
177
+ OnProgress ? . Invoke ( ( float ) _printIndex / ( listCnt - 1 ) ) ;
142
178
if ( cp . imgIndex > 0 ) //这是一个图片
143
179
{
144
180
_textField . richTextField . ShowHtmlObject ( cp . imgIndex - 1 , true ) ;
145
181
return true ;
146
182
}
147
183
else if ( ! char . IsWhiteSpace ( _textField . parsedText [ _printIndex - 1 ] ) )
184
+ {
148
185
return true ;
186
+ }
149
187
}
150
188
189
+ // 打字完成
190
+ OnComplete ? . Invoke ( ) ;
151
191
Cancel ( ) ;
152
192
return false ;
153
193
}
154
194
155
- private void output ( int vertCount )
195
+ private void Output ( int vertCount )
156
196
{
157
- int start , end ;
158
-
159
- start = _mainLayerStart + _vertIndex ;
160
- end = start + vertCount ;
197
+ var start = _mainLayerStart + _vertIndex ;
198
+ var end = start + vertCount ;
161
199
for ( int i = start ; i < end ; i ++ )
200
+ {
162
201
_vertices [ i ] = _backupVerts [ i ] ;
202
+ }
163
203
164
204
if ( _stroke )
165
205
{
@@ -193,27 +233,44 @@ private void output(int vertCount)
193
233
/// <summary>
194
234
/// 打印的协程。
195
235
/// </summary>
196
- /// <param name="interval">每个字符输出的时间间隔</param>
236
+ /// <param name="interval">每个字符输出的时间间隔,单位秒 </param>
197
237
/// <returns></returns>
198
238
public IEnumerator Print ( float interval )
199
239
{
200
240
while ( Print ( ) )
241
+ {
201
242
yield return new WaitForSeconds ( interval ) ;
243
+ }
202
244
}
203
245
204
246
/// <summary>
205
247
/// 使用固定时间间隔完成整个打印过程。
206
248
/// </summary>
207
- /// <param name="interval"></param>
249
+ /// <param name="interval">每个字符输出的时间间隔,单位秒 </param>
208
250
public void PrintAll ( float interval )
209
251
{
210
- Timers . inst . StartCoroutine ( Print ( interval ) ) ;
252
+ var coroutine = Print ( interval ) ;
253
+ Timers . inst . StopCoroutine ( coroutine ) ;
254
+ Timers . inst . StartCoroutine ( coroutine ) ;
255
+ }
256
+
257
+ /// <summary>
258
+ /// 快速完成方法
259
+ /// </summary>
260
+ public void CompleteInstantly ( )
261
+ {
262
+ PrintAll ( 0.005f ) ;
211
263
}
212
264
265
+ /// <summary>
266
+ /// 取消
267
+ /// </summary>
213
268
public void Cancel ( )
214
269
{
215
270
if ( ! _started )
271
+ {
216
272
return ;
273
+ }
217
274
218
275
_started = false ;
219
276
_textField . graphics . meshModifier -= OnMeshModified ;
@@ -239,10 +296,12 @@ void OnMeshModified()
239
296
for ( int i = 0 ; i < vertCount ; i ++ )
240
297
{
241
298
if ( _vertices [ i ] != zero )
299
+ {
242
300
_vertices [ i ] = _backupVerts [ i ] ;
301
+ }
243
302
}
244
303
245
304
_textField . graphics . mesh . vertices = _vertices ;
246
305
}
247
306
}
248
- }
307
+ }
0 commit comments