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