14
14
using System . Text ;
15
15
using UnityEngine . EventSystems ;
16
16
using UnityEngine . Events ;
17
+ using System ;
17
18
18
- public class InlineText : Text , IPointerClickHandler
19
+ public class InlineText : Text , IPointerClickHandler
19
20
{
20
21
// 用正则取 [图集ID#表情Tag] ID值==-1 ,表示为超链接
21
22
private static readonly Regex _InputTagRegex = new Regex ( @"\[(\-{0,1}\d{0,})#(.+?)\]" , RegexOptions . Singleline ) ;
@@ -95,8 +96,8 @@ protected override void OnPopulateMesh(VertexHelper toFill)
95
96
//计算quad占位的信息
96
97
CalcQuadInfo ( verts ) ;
97
98
//计算包围盒
98
- CalcBoundsInfo ( toFill ) ;
99
-
99
+ CalcBoundsInfo ( verts , toFill , settings ) ;
100
+
100
101
if ( roundingOffset != Vector2 . zero )
101
102
{
102
103
for ( int i = 0 ; i < vertCount ; ++ i )
@@ -121,12 +122,12 @@ protected override void OnPopulateMesh(VertexHelper toFill)
121
122
toFill . AddUIVertexQuad ( m_TempVerts ) ;
122
123
}
123
124
}
124
-
125
+
125
126
m_DisableFontTextureRebuiltCallback = false ;
126
-
127
+
127
128
}
128
129
129
-
130
+
130
131
#region 计算Quad占位信息
131
132
132
133
void CalcQuadInfo ( IList < UIVertex > verts )
@@ -170,7 +171,7 @@ void UpdateDrawnSprite()
170
171
}
171
172
_listSpriteInfo . Add ( item . Value ) ;
172
173
}
173
-
174
+
174
175
foreach ( var item in _DrawSpriteInfo )
175
176
{
176
177
_InlineManager . UpdateTextInfo ( item . Key , this , item . Value ) ;
@@ -180,33 +181,35 @@ void UpdateDrawnSprite()
180
181
#endregion
181
182
182
183
#region 处理超链接的包围盒
183
- void CalcBoundsInfo ( VertexHelper toFill )
184
+ void CalcBoundsInfo ( IList < UIVertex > verts , VertexHelper toFill , TextGenerationSettings settings )
184
185
{
186
+ #region 包围框
185
187
// 处理超链接包围框
186
188
UIVertex vert = new UIVertex ( ) ;
187
189
foreach ( var hrefInfo in _ListHrefInfos )
188
190
{
189
191
hrefInfo . boxes . Clear ( ) ;
190
- if ( hrefInfo . startIndex >= toFill . currentVertCount )
192
+ if ( hrefInfo . startIndex >= verts . Count )
191
193
{
192
194
continue ;
193
195
}
194
196
195
197
// 将超链接里面的文本顶点索引坐标加入到包围框
196
- toFill . PopulateUIVertex ( ref vert , hrefInfo . startIndex ) ;
198
+ vert = verts [ hrefInfo . startIndex ] ;
197
199
var pos = vert . position ;
198
200
var bounds = new Bounds ( pos , Vector3 . zero ) ;
199
201
for ( int i = hrefInfo . startIndex , m = hrefInfo . endIndex ; i < m ; i ++ )
200
202
{
201
- if ( i >= toFill . currentVertCount )
203
+ if ( i >= verts . Count )
202
204
{
203
205
break ;
204
206
}
205
207
206
- toFill . PopulateUIVertex ( ref vert , i ) ;
208
+ vert = verts [ i ] ;
207
209
pos = vert . position ;
208
- if ( pos . x < bounds . min . x ) // 换行重新添加包围框
210
+ if ( pos . x < bounds . min . x )
209
211
{
212
+ // 换行重新添加包围框
210
213
hrefInfo . boxes . Add ( new Rect ( bounds . min , bounds . size ) ) ;
211
214
bounds = new Bounds ( pos , Vector3 . zero ) ;
212
215
}
@@ -215,8 +218,40 @@ void CalcBoundsInfo(VertexHelper toFill)
215
218
bounds . Encapsulate ( pos ) ; // 扩展包围框
216
219
}
217
220
}
221
+ //添加包围盒
218
222
hrefInfo . boxes . Add ( new Rect ( bounds . min , bounds . size ) ) ;
219
223
}
224
+ #endregion
225
+
226
+ #region 添加下划线
227
+ TextGenerator _UnderlineText = new TextGenerator ( ) ;
228
+ _UnderlineText . Populate ( "_" , settings ) ;
229
+ IList < UIVertex > _TUT = _UnderlineText . verts ;
230
+ foreach ( var item in _ListHrefInfos )
231
+ {
232
+ for ( int i = 0 ; i < item . boxes . Count ; i ++ )
233
+ {
234
+ //计算下划线的位置
235
+ Vector3 [ ] _ulPos = new Vector3 [ 4 ] ;
236
+ _ulPos [ 0 ] = item . boxes [ i ] . position + new Vector2 ( 0.0f , fontSize * 0.2f ) ;
237
+ _ulPos [ 1 ] = _ulPos [ 0 ] + new Vector3 ( item . boxes [ i ] . width , 0.0f ) ;
238
+ _ulPos [ 2 ] = item . boxes [ i ] . position + new Vector2 ( item . boxes [ i ] . width , 0.0f ) ;
239
+ _ulPos [ 3 ] = item . boxes [ i ] . position ;
240
+ //绘制下划线
241
+ for ( int j = 0 ; j < 4 ; j ++ )
242
+ {
243
+ m_TempVerts [ j ] = _TUT [ j ] ;
244
+ m_TempVerts [ j ] . color = Color . blue ;
245
+ m_TempVerts [ j ] . position = _ulPos [ j ] ;
246
+ if ( j == 3 )
247
+ toFill . AddUIVertexQuad ( m_TempVerts ) ;
248
+ }
249
+
250
+ }
251
+ }
252
+
253
+ #endregion
254
+
220
255
}
221
256
#endregion
222
257
@@ -226,28 +261,31 @@ private string GetOutputText()
226
261
_SpriteInfo = new Dictionary < int , SpriteTagInfo > ( ) ;
227
262
StringBuilder _textBuilder = new StringBuilder ( ) ;
228
263
int _textIndex = 0 ;
229
-
264
+
230
265
foreach ( Match match in _InputTagRegex . Matches ( text ) )
231
266
{
232
267
int _tempID = 0 ;
233
268
if ( ! string . IsNullOrEmpty ( match . Groups [ 1 ] . Value ) )
234
269
_tempID = int . Parse ( match . Groups [ 1 ] . Value ) ;
235
- string _tempTag = match . Groups [ 2 ] . Value ;
270
+ string _tempTag = match . Groups [ 2 ] . Value ;
236
271
//更新超链接
237
272
if ( _tempID == - 1 )
238
273
{
239
274
_textBuilder . Append ( text . Substring ( _textIndex , match . Index - _textIndex ) ) ;
240
275
_textBuilder . Append ( "<color=blue>" ) ;
276
+ int _startIndex = _textBuilder . Length * 4 ;
277
+ _textBuilder . Append ( "[" + match . Groups [ 2 ] . Value + "]" ) ;
278
+ int _endIndex = _textBuilder . Length * 4 - 2 ;
279
+ _textBuilder . Append ( "</color>" ) ;
241
280
242
281
var hrefInfo = new HrefInfo
243
282
{
244
- startIndex = _textBuilder . Length * 4 , // 超链接里的文本起始顶点索引
245
- endIndex = ( _textBuilder . Length + match . Groups [ 2 ] . Length - 1 ) * 4 + 3 ,
246
- name = match . Groups [ 2 ] . Value
283
+ startIndex = _startIndex , // 超链接里的文本起始顶点索引
284
+ endIndex = _endIndex ,
285
+ name = match . Groups [ 2 ] . Value
247
286
} ;
248
287
_ListHrefInfos . Add ( hrefInfo ) ;
249
288
250
- _textBuilder . Append ( "[" + match . Groups [ 2 ] . Value + "]</color>" ) ;
251
289
}
252
290
//更新表情
253
291
else
@@ -256,7 +294,7 @@ private string GetOutputText()
256
294
|| ! _InlineManager . _IndexSpriteInfo [ _tempID ] . ContainsKey ( _tempTag ) )
257
295
continue ;
258
296
SpriteInforGroup _tempGroup = _InlineManager . _IndexSpriteInfo [ _tempID ] [ _tempTag ] ;
259
-
297
+
260
298
_textBuilder . Append ( text . Substring ( _textIndex , match . Index - _textIndex ) ) ;
261
299
int _tempIndex = _textBuilder . Length * 4 ;
262
300
_textBuilder . Append ( @"<quad size=" + _tempGroup . size + " width=" + _tempGroup . width + " />" ) ;
@@ -316,12 +354,12 @@ public void OnPointerClick(PointerEventData eventData)
316
354
}
317
355
}
318
356
}
357
+
358
+
319
359
#endregion
320
360
321
-
322
361
}
323
362
324
-
325
363
public class SpriteTagInfo
326
364
{
327
365
//图集ID
0 commit comments