UGUI源码剖析(Text)

Runtime类图分析

Text继承了MaskableGraphic, ILayoutElement


关联重要类

FontData类

是一个字体配置类,继承了ISerializationCallbackReceiver接口,这个接口需要实现OnBeforeSerialize和OnAfterDeserialize两个方法,它们分别会在序列化之前和反序列化之后调用。FontData的OnAfterDeserialize里便在反序列化之后,限定m_FontSize在0到300之间,限定m_MinSize在0和m_FontSize之间,限定m_MaxSize在m_FontSize和300之间。

是对字体数据的一层封装,内部包含了Text的绝大多数可以设置的属性

   

TextGenerator类

用于渲染文本的类,缓存顶点,字符信息,行信息。

GetCharactersArray 返回当前的UICharInfo[]

GetLinesArray 返回当前的UILineInfo[]

GetVerticesArray 返回当前的UIVertex[]

PopulateWithErrors 为给定设置的字符串,生成顶点和其他数据

 

FontUpdateTracker类

FontUpdateTracker是一个静态类,维护了一个静态字典:

static Dictionary<Font, HashSet<Text>> m_Tracked = new Dictionary<Font, HashSet<Text>>();

TrackText方法

如果将要加入的Text.font已经在m_Tracked,不做处理。如果不在m_Tracked中,并且m_Tracked.Count为0,监听事件Font.textureRebuilt,并增加RebuildForFont回调。然后把Text添加到m_Tracked中。

UntrackText方法

如果将要移除的Text.font已经在m_Tracked,从m_Tracked移除。当HashSet<Text>.Count为0时,从事件Font.textureRebuilt中移除RebuildForFont回调。

RebuildForFont方法

根据传入的Font在m_Tracked中找到HashSet<Text>,如果不为空,遍历HashSet<Text>,调用text.FontTextureChanged(),来生成顶点等数据。


关键方法分析

生命周期方法

OnEnable方法

先调用TextGenerator.Invalidate(),使TextGenerator失效,将在下次调用Populate时,强制全文生成。之后调用了FontUpdateTracker.TrackText,把自己添加到字体更新追踪器中。

OnDisable方法

调用FontUpdateTracker.UntrackText,把自己从字体更新追踪器中移除。

Reset方法

仅在Editor下运行,调用AssignDefaultFont通过Resources获取内部Font资源Arial.ttf

OnRebuildRequested方法

在Font的资源重新导入时需要重新删除然后创建FontUpdateTracker对它的Track,同时还需要判断 TextGenerator是否仍然有效

FontUpdateTracker.UntrackText(this)

FontUpdateTracker.TrackText(this)

OnValidate方法

如果Text的监视面板改变了这个font,那么可以在这个函数中去响应,首先判断当前是否隐藏了,如果没有隐藏那么再去判断当前的font是否为上一个TrackedFont,如果不是那么在FontUpdateTracker中移除当前的font,再更新当前的font同时加入到FontUpdateTracker中,将LastTrackedFont更新为移除的旧的font

 

Mesh部分

OnPopulateMesh方法

  • 重写Graphic的OnPopulateMesh方法,会在Graphic的Rebuild方法被调用,为CanvasRenderer的Mesh提供了顶点位置、顶点颜色、UV和三角形信息。
  • 根据用户设置调用GetGenerationSettings生成了一个TextGenerationSettings文本生成设置,
  • 然后调用TextGenerator.PopulateWithErrors生成Mesh的顶点、顶点颜色、UV和三角形信息。
  • 计算偏移量(例如左对齐需要紧靠左边),最后遍历TextGenerator的顶点数组,将它们的位置除以pixelsPerUnit(每单元像素)并加上偏移量(如果有的话),得到的结果填到VertexHelper。

 

刷新方法

FontTextureChanged方法

先调用TextGenerator.Invalidate(),使TextGenerator失效。如果在CanvasUpdateRegistry的图形的重建中或布局的重建中,调用UpdateGeometry只为新的UV生成顶点。否则,调用SetAllDirty(分别设置Layout布局、Vertices顶点和Material材质为Dirty)

 


重要属性和字段分析

public virtual string text

Get方法

返回m_Text

Set方法

如果value为空,给m_Text设置空字符串。然后调用SetVerticesDirty,等待重绘。

如果value不为空,把value设置到m_Text,调用SetVerticesDirty和SetLayoutDirty,等待重绘。

 

public Font font

Get方法

返回m_FontData.font

Set方法

先把自己从FontUpdateTracker移除,把value设置给m_FontData.font,然后把自己添加到FontUpdateTracker中。最后调用SetAllDirty,等待重绘。

其他的一些属性,比如fontSize,alignment(对齐方式),supportRichText(支持富文本),horizontalOverflow(水平是否溢出),verticalOverflow(垂直是否溢出),lineSpacing(行间距),fontStyle(字体样式),这些方法的Set方法,会给m_FontData中的相应属性赋值,并调用SetVerticesDirty和SetLayoutDirty,等待重绘。

 

public bool supportRichText

是否支持RichText

 

 public bool resizeTextForBestFit

是否允许随着文本内容自适应

 

public int resizeTextMinSize

public int resizeTextMaxSize

在开启自适应的情况下,Text的最大的Size和最小的Size

 

public TextAnchor alignment

对齐方式

 

public bool alignByGeometry

使用字形几何图形的范围来执行水平对齐,而不是字形度量。

 

public int fontSize

字体大小

 

public HorizontalWrapMode horizontalOverflow

 Wrap = 0,水平方向上文本将进行文字换行以适应边界。
        Overflow = 1,水平方向上文本可以超出文本图形的水平边界。

public VerticalWrapMode verticalOverflow

Truncate = 0,竖直方向上文本将进行文字换行以适应边界。
        Overflow = 1,竖直方向上文本可以超出文本图形的水平边界。

 

 public float lineSpacing

行与行之间的间距

 

public FontStyle fontStyle

字体的Style


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值