Skip to content

Commit 579d3f2

Browse files
committed
[增加]1. 增加打字机效果的进程中和完成的回调
1 parent 34cc2b6 commit 579d3f2

File tree

1 file changed

+73
-14
lines changed

1 file changed

+73
-14
lines changed

Runtime/Core/Text/TypingEffect.cs

Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections;
1+
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
34
using UnityEngine;
45

@@ -25,6 +26,17 @@ public class TypingEffect
2526

2627
protected bool _started;
2728

29+
30+
/// <summary>
31+
/// 打字完成事件
32+
/// </summary>
33+
public Action OnComplete;
34+
35+
/// <summary>
36+
/// 打字进度变化事件
37+
/// </summary>
38+
public Action<float> OnProgress;
39+
2840
/// <summary>
2941
///
3042
/// </summary>
@@ -42,16 +54,21 @@ public TypingEffect(TextField textField)
4254
public TypingEffect(GTextField textField)
4355
{
4456
if (textField is GRichTextField)
57+
{
4558
_textField = ((RichTextField)textField.displayObject).textField;
59+
}
4660
else
61+
{
4762
_textField = (TextField)textField.displayObject;
63+
}
64+
4865
_textField.EnableCharPositionSupport();
4966
}
5067

5168
/// <summary>
5269
/// 总输出次数
5370
/// </summary>
54-
public int totalTimes
71+
public int TotalTimes
5572
{
5673
get
5774
{
@@ -60,10 +77,15 @@ public int totalTimes
6077
for (int i = 0; i < charPositions.Count - 1; i++)
6178
{
6279
if (charPositions[i].imgIndex > 0) //这是一个图片
80+
{
6381
times++;
82+
}
6483
else if (!char.IsWhiteSpace(_textField.parsedText[i]))
84+
{
6585
times++;
86+
}
6687
}
88+
6789
return times;
6890
}
6991
}
@@ -89,18 +111,26 @@ public void Start()
89111
int vertCount = _textField.graphics.mesh.vertexCount;
90112
_backupVerts = _textField.graphics.mesh.vertices;
91113
if (_vertices == null || _vertices.Length != vertCount)
114+
{
92115
_vertices = new Vector3[vertCount];
116+
}
117+
93118
Vector3 zero = Vector3.zero;
94119
for (int i = 0; i < vertCount; i++)
120+
{
95121
_vertices[i] = zero;
122+
}
123+
96124
_textField.graphics.mesh.vertices = _vertices;
97125

98126
//隐藏所有混排的对象
99127
if (_textField.richTextField != null)
100128
{
101129
int ec = _textField.richTextField.htmlElementCount;
102130
for (int i = 0; i < ec; i++)
131+
{
103132
_textField.richTextField.ShowHtmlObject(i, false);
133+
}
104134
}
105135

106136
int charCount = _textField.charPositions.Count;
@@ -128,38 +158,48 @@ public void Start()
128158
public bool Print()
129159
{
130160
if (!_started)
161+
{
131162
return false;
163+
}
132164

133-
TextField.CharPosition cp;
134165
List<TextField.CharPosition> charPositions = _textField.charPositions;
135166
int listCnt = charPositions.Count;
136167

137168
while (_printIndex < listCnt - 1) //最后一个是占位的,无效的,所以-1
138169
{
139-
cp = charPositions[_printIndex++];
170+
var cp = charPositions[_printIndex++];
140171
if (cp.vertCount > 0)
141-
output(cp.vertCount);
172+
{
173+
Output(cp.vertCount);
174+
}
175+
176+
// 更新进度
177+
OnProgress?.Invoke((float)_printIndex / (listCnt - 1));
142178
if (cp.imgIndex > 0) //这是一个图片
143179
{
144180
_textField.richTextField.ShowHtmlObject(cp.imgIndex - 1, true);
145181
return true;
146182
}
147183
else if (!char.IsWhiteSpace(_textField.parsedText[_printIndex - 1]))
184+
{
148185
return true;
186+
}
149187
}
150188

189+
// 打字完成
190+
OnComplete?.Invoke();
151191
Cancel();
152192
return false;
153193
}
154194

155-
private void output(int vertCount)
195+
private void Output(int vertCount)
156196
{
157-
int start, end;
158-
159-
start = _mainLayerStart + _vertIndex;
160-
end = start + vertCount;
197+
var start = _mainLayerStart + _vertIndex;
198+
var end = start + vertCount;
161199
for (int i = start; i < end; i++)
200+
{
162201
_vertices[i] = _backupVerts[i];
202+
}
163203

164204
if (_stroke)
165205
{
@@ -193,27 +233,44 @@ private void output(int vertCount)
193233
/// <summary>
194234
/// 打印的协程。
195235
/// </summary>
196-
/// <param name="interval">每个字符输出的时间间隔</param>
236+
/// <param name="interval">每个字符输出的时间间隔,单位秒</param>
197237
/// <returns></returns>
198238
public IEnumerator Print(float interval)
199239
{
200240
while (Print())
241+
{
201242
yield return new WaitForSeconds(interval);
243+
}
202244
}
203245

204246
/// <summary>
205247
/// 使用固定时间间隔完成整个打印过程。
206248
/// </summary>
207-
/// <param name="interval"></param>
249+
/// <param name="interval">每个字符输出的时间间隔,单位秒</param>
208250
public void PrintAll(float interval)
209251
{
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);
211263
}
212264

265+
/// <summary>
266+
/// 取消
267+
/// </summary>
213268
public void Cancel()
214269
{
215270
if (!_started)
271+
{
216272
return;
273+
}
217274

218275
_started = false;
219276
_textField.graphics.meshModifier -= OnMeshModified;
@@ -239,10 +296,12 @@ void OnMeshModified()
239296
for (int i = 0; i < vertCount; i++)
240297
{
241298
if (_vertices[i] != zero)
299+
{
242300
_vertices[i] = _backupVerts[i];
301+
}
243302
}
244303

245304
_textField.graphics.mesh.vertices = _vertices;
246305
}
247306
}
248-
}
307+
}

0 commit comments

Comments
 (0)