UGUI源码之Graphic
Graphic是用来显示图像的一个抽象类,是MaskableGraphic的父类,而MaskableGraphic是Image、RawImage、Text的父类。
Graphic继承于UIBehaviour和ICanvasElement。
UIBehaviour是所有UI的父类,声明了Unity生命周期的函数,除IsDestroyed函数外都是虚函数。
ICanvasElement提供了Canvas对其管理的元素的更新事件的接口。
继承于UIBehaviour的函数:
OnRectTransformDimensionsChange(RectTransform改变时):把Vertices和layout设为dirty。
OnBeforeTransformParentChanged(父节点改变前):把Canvas和Graphic的连接关系从GraphicRegistry中移除,并且让LayoutRebuilder重建布局。
OnTransformParentChanged(父节点改变时):调用CacheCanvas函数,获取父节点的Canvas组件,在GraphicRegistry中注册Canvas和Graphic的连接关系,然后调用SetAllDirty函数。
OnEnable:调用CacheCanvas函数,获取父节点的Canvas组件,在GraphicRegistry中注册Canvas和Graphic的连接关系,把s_WhiteTexture(MainTexture)设置为默认的白色纹理,然后调用SetAllDirty函数。
OnDisable:在GraphicRegistry和CanvasUpdateRegistry分别移除注册,canvasRenderer清理了,然后让LayoutRebuilder重建布局,
OnCanvasHierarchyChanged(父节点的Canvas改变时):重新在GraphicRegistry中注册新改变的Canvas。
OnDidApplyAnimationProperties(应用动画属性时):调用SetAllDirty函数。
讲讲SetAllDirty
public virtual void SetAllDirty()
{
SetLayoutDirty();
SetVerticesDirty();
SetMaterialDirty();
} /// <summary>
/// Mark the layout as dirty and needing rebuilt.
/// </summary>
/// <remarks>
/// Send a OnDirtyLayoutCallback notification if any elements are registered. See RegisterDirtyLayoutCallback
/// </remarks>
public virtual void SetLayoutDirty()
{
if (!IsActive())
return; LayoutRebuilder.MarkLayoutForRebuild(rectTransform); if (m_OnDirtyLayoutCallback != null)
m_OnDirtyLayoutCallback();
} /// <summary>
/// Mark the vertices as dirty and needing rebuilt.
/// </summary>
/// <remarks>
/// Send a OnDirtyVertsCallback notification if any elements are registered. See RegisterDirtyVerticesCallback
/// </remarks>
public virtual void SetVerticesDirty()
{
if (!IsActive())
return; m_VertsDirty = true;
CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this); if (m_OnDirtyVertsCallback != null)
m_OnDirtyVertsCallback();
} /// <summary>
/// Mark the material as dirty and needing rebuilt.
/// </summary>
/// <remarks>
/// Send a OnDirtyMaterialCallback notification if any elements are registered. See RegisterDirtyMaterialCallback
/// </remarks>
public virtual void SetMaterialDirty()
{
if (!IsActive())
return; m_MaterialDirty = true;
CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this); if (m_OnDirtyMaterialCallback != null)
m_OnDirtyMaterialCallback();
}
SetLayoutDirty中LayoutRebuilder重建布局,SetVerticesDirty和SetMaterialDirty里注册CanvasUpdateRegistry,将组件加到m_GraphicRebuildQueue中,等待Canvas重建时重建Graphic。并且三个函数都会通知执行对应的回调事件。可以通过RegisterDirtyLayoutCallback来增加回调。
继承于ICanvasElement的函数:
Rebuild(在预渲染循环时重建几何图形和它的材质):没有被剔除的话,更新顶点(几何结构)和材质,即调用UpdateGeometry和UpdateMaterial。
UpdateGeometry
protected virtual void UpdateGeometry()
{
if (useLegacyMeshGeneration)
DoLegacyMeshGeneration();
else
DoMeshGeneration();
}
DoLegacyMeshGeneration和DoMeshGeneration都是生成网格的函数,逻辑相似。DoLegacyMeshGeneration直接改动workerMesh,DoMeshGeneration使用VertexHelper来完成部分逻辑。
这里以DoMeshGeneration为例
private void DoMeshGeneration()
{
if (rectTransform != null && rectTransform.rect.width >= && rectTransform.rect.height >= )
OnPopulateMesh(s_VertexHelper);
else
s_VertexHelper.Clear(); // clear the vertex helper so invalid graphics dont draw. var components = ListPool<Component>.Get();
GetComponents(typeof(IMeshModifier), components); for (var i = ; i < components.Count; i++)
((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper); ListPool<Component>.Release(components); s_VertexHelper.FillMesh(workerMesh);
canvasRenderer.SetMesh(workerMesh);
}
OnPopulateMesh:建立4个顶点,构筑两个三角形(形成一个矩形),保存到VertexHelper里。
ModifyMesh:IMeshModifier类型的组件调用ModifyMesh,修改网格信息。
FillMesh:s_VertexHelper里修改后的信息赋值给workerMesh。
SetMesh:将网格信息提交给canvasRenderer。
UpdateMaterial
protected virtual void UpdateMaterial()
{
if (!IsActive())
return; canvasRenderer.materialCount = ;
canvasRenderer.SetMaterial(materialForRendering, );
canvasRenderer.SetTexture(mainTexture);
}
设置材质和纹理。
以上就是Graphic实现显示图像的核心代码,此外还有个比较重要的函数CrossFadeColor,它会使用TweenRunner和ColorTween以协程的方式来改变颜色。
UGUI源码之Graphic的更多相关文章
- 【UGUI源码分析】Unity遮罩之Mask详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- 【UGUI源码分析】Unity遮罩之RectMask2D详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- UGUI源码之EventSystem
今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...
- UGUI源码之Selectable
Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...
- uGUI源码调试
uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- [UGUI]图文混排(二):Text源码分析
UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
随机推荐
- 浅谈Transformer 及Attention网络
1 Transformer 模型结构处理自然语言序列的模型有 rnn, cnn(textcnn),但是现在介绍一种新的模型,transformer.与RNN不同的是,Transformer直接把一句话 ...
- Math.abs( x )
Math.abs( x ) 下面是参数的详细信息: x : 一个数字 返回值: 返回一个数字的绝对值 <html> <head> <title>JavaScript ...
- HTTP协议---三次握手
HTTP协议 关于协议 对于应用层开发人员,接触最多的网络协议通常都是传输层的TCP,为什么这么说,因为再往上的应用层协议,如:HTTP.HTTPS.POP3.SMTP.RPC.FTP.TELNE ...
- CF1B.Spreadsheets(电子表格) 题解 模拟
作者:zifeiy 标签:模拟 题目出处:Spreadsheets 题目描述 在流行的电子表格系统中(例如,在Excel中),使用如下计算方式来对列号进行计算. 第1列对应A,第2列对应B,--,第2 ...
- [转]UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- 2018-2-13-WPF-拖动时出现-Invalid-FORMATETC-structure
title author date CreateTime categories WPF 拖动时出现 Invalid FORMATETC structure lindexi 2018-2-13 17:2 ...
- UVa 1627 - Team them up!——[0-1背包]
Your task is to divide a number of persons into two teams, in such a way, that: everyone belongs to ...
- P1087 N个数的最大公约数
题目描述 今天灵灵学习了使用欧几里得算法(即:辗转相除法)求解两个数的最大公约数.于是他决定用这个方法求解 \(N\) 个数的最大公约数. 输入格式 输入的第一行包含一个整数 \(N(1 \le N ...
- MySQL——修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性. 1. 用 CREATE OR REPLACE VIEW 语句修改视图 语法格式 ...
- 深浅Copy的理解
在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝. 而对象又分为两种,一种是不可变对象(字符串.元组.数字 ),一种是可变对象(列表.字典). 而深浅拷贝有三种情况:拷贝的是不可变对象.拷 ...