码迷,mamicode.com
首页 > 其他好文 > 详细

[UGUI]图文混排(二):下划线

时间:2018-06-10 18:33:53      阅读:642      评论:0      收藏:0      [点我收藏+]

标签:bucket   ons   int   tag   load   count   lis   expr   val   

UGUI源码:

https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags

 

首先下载一份UGUI源码,这里我下载的版本是5.3.2f1。然后找到Text.cs,里面有方法OnPopulateMesh,这个方法会修改文字的顶点。而图文混排,涉及到顶点数据的修改。因此,我们的重点就是对这个方法进行修改,这里给出一个最简单的重写版本,它和普通的text是一样的。

 1 using System.Collections.Generic;
 2 using System.Text.RegularExpressions;
 3 using System.Text;
 4 using UnityEngine.EventSystems;
 5 using System;
 6 using UnityEngine;
 7 using UnityEngine.UI;
 8 
 9 //下划线<material=underline c=#ffffff h=1 n=*** p=***>blablabla...</material>
10 public class RichTextTest : Text {
11     private FontData m_FontData = FontData.defaultFontData;
12 
13     readonly UIVertex[] m_TempVerts = new UIVertex[4];
14     protected override void OnPopulateMesh(VertexHelper toFill)
15     {
16         if (font == null)
17             return;
18 
19         // We don‘t care if we the font Texture changes while we are doing our Update.
20         // The end result of cachedTextGenerator will be valid for this instance.
21         // Otherwise we can get issues like Case 619238.
22         m_DisableFontTextureRebuiltCallback = true;
23 
24         Vector2 extents = rectTransform.rect.size;
25 
26         var settings = GetGenerationSettings(extents);
27         cachedTextGenerator.Populate(text, settings);
28 
29         Rect inputRect = rectTransform.rect;
30 
31         // get the text alignment anchor point for the text in local space
32         Vector2 textAnchorPivot = GetTextAnchorPivot(m_FontData.alignment);
33         Vector2 refPoint = Vector2.zero;
34         refPoint.x = Mathf.Lerp(inputRect.xMin, inputRect.xMax, textAnchorPivot.x);
35         refPoint.y = Mathf.Lerp(inputRect.yMin, inputRect.yMax, textAnchorPivot.y);
36 
37         // Determine fraction of pixel to offset text mesh.
38         Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint;
39 
40         // Apply the offset to the vertices
41         IList<UIVertex> verts = cachedTextGenerator.verts;
42         float unitsPerPixel = 1 / pixelsPerUnit;
43         //Last 4 verts are always a new line...
44         int vertCount = verts.Count - 4;
45 
46         toFill.Clear();
47         if (roundingOffset != Vector2.zero)
48         {
49             for (int i = 0; i < vertCount; ++i)
50             {
51                 int tempVertsIndex = i & 3;
52                 m_TempVerts[tempVertsIndex] = verts[i];
53                 m_TempVerts[tempVertsIndex].position *= unitsPerPixel;
54                 m_TempVerts[tempVertsIndex].position.x += roundingOffset.x;
55                 m_TempVerts[tempVertsIndex].position.y += roundingOffset.y;
56                 if (tempVertsIndex == 3)
57                     toFill.AddUIVertexQuad(m_TempVerts);
58             }
59         }
60         else
61         {
62             for (int i = 0; i < vertCount; ++i)
63             {
64                 int tempVertsIndex = i & 3;
65                 m_TempVerts[tempVertsIndex] = verts[i];
66                 m_TempVerts[tempVertsIndex].position *= unitsPerPixel;
67                 if (tempVertsIndex == 3)
68                     toFill.AddUIVertexQuad(m_TempVerts);
69             }
70         }
71         m_DisableFontTextureRebuiltCallback = false;
72     }
73 }

 

可以看到,顶点的数据在cachedTextGenerator中,打印一下,会发现1个字符有4个顶点,而顶点的排列如下:

技术分享图片

 

[UGUI]图文混排(二):下划线

标签:bucket   ons   int   tag   load   count   lis   expr   val   

原文地址:https://www.cnblogs.com/lyh916/p/9161846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!