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的主要内容,如果未能解决你的问题,请参考以下文章