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的更多相关文章

  1. 【UGUI源码分析】Unity遮罩之Mask详细解读

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

  2. 【UGUI源码分析】Unity遮罩之RectMask2D详细解读

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

  3. UGUI源码之EventSystem

    今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...

  4. UGUI源码之Selectable

    Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...

  5. uGUI源码调试

    uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...

  6. Unity UGUI图文混排源码(一)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  7. [UGUI]图文混排(二):Text源码分析

    UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...

  8. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  9. Unity UGUI图文混排源码(二)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

随机推荐

  1. 【CSS3】使用CSS3制作全屏切换效果

    在线演示: DEMO DEMO中及以下代码并没有写兼容代码,请使用高级浏览器打开,IE版本对CSS3支持并不太友好,IE11打开没有滚屏效果. 兼容代码前缀: -webkit- -moz- -o- - ...

  2. MYSQL设置远程账户登陆总结,mysql修改、找回密码、增加新用户,MySQL数据库的23个注意事项

    1.5 设置及修改Mysql root用户密码1 设置密码方法mysqladmin -u root password '123456'mysqladmin -u root -p'123456' pas ...

  3. ES6 set和map数据结构对对象数组去重简单实现

    自从有了es6的set数据结构,数组的去重可以简单用一行代码实现,比如下面的方式 let arr = [1, 2, 2, 3, 4] function unique (arr) { return [. ...

  4. H3C 路由表查找规则(1)

  5. spring的几个面试题

    Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Spring 框架指的都是 Spring Fr ...

  6. C# 任务并行

    . List<int> ids = new List<int>(); ; i < ; i++) { ids.Add(i); } ;//最大并行数量 List<Tas ...

  7. 服务端CURL请求

    服务端与服务端之间,也存在接口编程. 比如我们网站服务端,需要发送短信.发送邮件.查询快递等,都需要调用第三方平台的接口. 1.php中发送请求 ①file_get_contents函数 :传递完整的 ...

  8. gradle 打包后第三方登录不上

    使用 gradlew clean assembleReleaseChannels 生成不用的渠道包后 第三方登录不上 原因:打包未设置好APP的 .keystore

  9. slim中的请求头

    请求头 每个 HTTP 请求都有请求头.这些元数据描述了 HTTP 请求,但在请求体中不可见.Slim 的 PSR 7 请求对象提供了几个检查请求头的方法. 获取所有的请求头,返回一个数组:getHe ...

  10. 使用idea构建Hibernate5项目

    使用工具:IntelliJ IDEA 2017.2.5 x64 MySql-8.0.1 hibernate-release-5.3.1.Final 导入的jar包: 以及连接MySql的jdbc包.和 ...