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 ...
随机推荐
- 深入Java线程管理(四):线程通讯
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- java io流与序列化反序列化
java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入 ...
- sublime text3神器插件
(首先安装)Package Control Package Control,就像 Linux 下的 apt-get 和 yum 一样,它是 Sublime Text 的包管理器 1.Emmet 是一 ...
- P1059 硬币翻转
题目描述 从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的.正面朝上的用1表示,背面朝上的用0表示.现在要求从这行的第一个硬币开始,将前若干个硬币一起翻面,问如果要将所有硬币翻到正面朝上,最少要 ...
- 【js】vue 2.5.1 源码学习 (三) Vue.extend 和 data的合并策略
大体思路 (三) 1. 子类父类 2.Vue.extend() //创建vue的子类 组件的语法器 Vue.extend(options) Profile().$mount('#app' ...
- P1007 N钱M鸡问题
题目描述 已知公鸡 \(5\) 元钱一只,母鸡 \(3\) 元钱一只,小鸡 \(3\) 只 \(1\) 元钱. 告诉你一个整数 \(n(1 \le n \le 1000)\) ,你现在要花 \(n\) ...
- 【t081】序列长度
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个整数序列,我们不知道她的长度是多少(即序列中整数的个数),但我们知道在某些区间中至少有多少个整数 ...
- Vue仿网易云PC端的网页
贴个网址:https://github.com/wangjie3186594/-PC- 声明一下:这个网页没做完!没做完!没做完! 本人新人一枚,按照的是我当前的学习进度做的项目,很多效果未 ...
- Flask框架知识点整合
Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...
- 如何修改eclipse中Dynamic web module的 version
我们直接在eclipse中修改Dynamic Web Module的话会报错,改不了的 所以我们可以找到项目文件中的.setting文件下的org.eclipse.wst.common.project ...