菜鸡读unity3d UGUI源码

2018-05-16  本文已影响383人  ManjackGo

前言

尽量用最简单易懂的文字说明。因为自己也是个菜鸡,所以会用菜鸡也听得懂的话来说。
思路是先看父类,然后一层一层下去,中间遇到没见过的类就点进去看一下。

UIBehaviour

一切UI组件的父类。叫爸爸。
是一个抽象类,定义了一堆虚方法,以及实现了唯一的一个实方法IsDestroyed()
除了unity本身的几个生命周期方法之外,还定义了几个值得注意的虚方法:

Graphic

可视元件之祖。
要求一定要有CanvasRenderer和RectTransform这两个组件。

话说起来CanvasRenderer是啥?
这个东西属于UnityEngine命名空间的,提供了一些可视的方法比如:

Fields

Methods

CacheCanvas()
从gameObject取出Canvas列表,然后把第一个设置为m_Canvas
所以这里又有一个问题,为啥graphic身上会有一个canvas??

分割线~~~

既然这么多次提到了GraphicRegistry.RegisterGraphicForCanvas(Canvas, Graphic)

看了一下,做了啥呢。从instance.m_Graphics里面以canvas为key取出一个IndexSet,然后把graphic添加进去。如果木有这个队列,就创建这个队列然后塞进去。
于是下一个问题就是:这个队列干嘛用的呢?
首先这个字典是private readonly的,用处有三个方法,一个注册,一个注销,以及一个取出来的方法
GetGraphicsForCanvas(Canvas canvas)(全局搜索发现这个方法被GraphicRaycaster.Raycast()用到啦~非常好)。
所以说这一切都是为了Raycast!!只是为了射线检测而已!!这样子的话不会很蠢吗!!!!

GraphicRegistry.UnregisterGraphicForCanvas(canvas, this);
CanvasUpdateRegistry.UnRegisterCanvasElementForRebuild(this);
- 注销canvas
- 不需要update了
- canvasRenderer.Clear() 啥意思呢? 
> Remove all cached vertices.
- 因为disable了,要消失了,所以叫布局可以重新布局啦~
`LayoutRebuilder.MarkLayoutForRebuild(rectTransform);`

所以要看一下这个LayoutRebuilder究竟怎么实现重绘的,应该最后会execute到具体某个layout上面去。
另外,要明确一下顶点的概念。清除顶点又是啥意思?

上一篇 下一篇

猜你喜欢

热点阅读