UGUI源码解析——RectMask2D

Posted Hello Bug.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UGUI源码解析——RectMask2D相关的知识,希望对你有一定的参考价值。

一:前言

RectMask2D是矩形遮罩组件,继承自UIBehaviour、IClipper(裁剪者)、ICanvasRaycastFilter,它是通过canvasRenderer.EnableRectClipping实现的裁剪
OnEnable时计算RectMask2D对象子物体中所有可遮罩的对象并将自身添加到待裁剪序列中,画布更新时会调用ClipperRegistry.instance.Cull方法实现待裁剪序列中每个元素的裁剪


二:源码解析

——AddClippable

添加裁剪对象
设置m_ShouldRecalculateClipRects为true,接着判断裁剪对象是否为MaskableGraphic,并添加到IClippable序列或MaskableGraphic序列中,最后将m_ForceClip设置为true
此方法在MaskableGraphic类中的UpdateClipParent方法中被调用


——RemoveClippable

移除裁剪对象
设置m_ShouldRecalculateClipRects为true,接着调用裁剪对象的SetClipRect方法关闭矩形裁剪,接着判断裁剪对象是否为MaskableGraphic,并从IClippable序列或MaskableGraphic序列中移除,最后将m_ForceClip设置为true
此方法在MaskableGraphic类中的UpdateClipParent方法中被调用


——OnEnable

首先将自身添加到裁剪序列中,然后调用Notify2DMaskStateChanged方法重新计算裁剪


——OnDisable

首先清空IClippable序列、MaskableGraphic序列、RectMask2D序列,并将自身从裁剪序列中移除,最后调用Notify2DMaskStateChanged方法重新计算裁剪


——PerformClipping

计算每个MaskableGraphic用于裁剪的区域
如果m_ShouldRecalculateClipRects为true,则调用GetRectMasksForClip方法找到父对象身上所有有效的RectMask2D组件(为了处理RectMask2D组件嵌套的情况,因为当有两个RectMask2D时,裁切范围是两个共同作用的区域),接着调用Clipping.FindCullAndClipWorldRect方法计算裁切区域,当确定了裁剪区域后,对m_ClipTargets和m_MaskableTargets序列中每一个待裁剪元素进行裁剪(SetClipRect)
此方法在ClipperRegistry类中的Cull方法中被调用

以上是关于UGUI源码解析——RectMask2D的主要内容,如果未能解决你的问题,请参考以下文章

UGUI源码解析——MaskUtilities

UGUI源码解析——MaskUtilities

UGUI源码解析——IClipper

UGUI源码解析——IClipper

Unity2017.1官方UGUI文档翻译——RectMask2D

UGUI源码解析——IMaterialModifier