UGUI源码解析(十六)RectMask2D

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq826364410/article/details/88139894

RectMask2D

RectMask2D继承了UIBehaviour, IClipper, ICanvasRaycastFilter

维护了一个IClippable类型的列表:

private HashSet<IClippable> m_ClipTargets = new HashSet<IClippable>();

AddClippable方法

设置m_ShouldRecalculateClipRects为true,把clippable类型的组件添加到m_ClipTargets列表中,设置m_ForceClip为true,这个参数会在PerformClipping被用到。这个方法在MaskableGraphic中的UpdateClipParent方法中被调用。

RemoveClippable方法

设置m_ShouldRecalculateClipRects为true,调用clippable.SetClipRect(new Rect(), false)关闭矩形裁剪,把clippable类型的组件从m_ClipTargets列表中移除,设置m_ForceClip为true。这个方法在MaskableGraphic中的UpdateClipParent方法中被调用。

OnEnable方法

设置m_ShouldRecalculateClipRects为true,把自己注册到ClipperRegistry,并调用MaskUtilities.Notify2DMaskStateChanged,重新计算裁剪

ClipperRegistry

ClipperRegistry是一个单例,是裁剪器的注册处。在CanvasUpdateRegistry的PerformUpdate方法中,布局重建完成后,会调用组件的裁剪方法,ClipperRegistry.instance.Cull(),在Cull方法中,会遍历每一个IClipper执行PerformClipping方法。

OnDisable方法

清空m_ClipTargets,清空m_Clippers,把自己从ClipperRegistry中解除注册,并调用MaskUtilities.Notify2DMaskStateChanged,重新计算裁剪

IsRaycastLocationValid方法

继承自ICanvasRaycastFilter,返回RectTransformUtility.RectangleContainsScreenPoint,RectTransform是否包含从相机看到的点。

PerformClipping方法

PerformClipping是继承自IClipper接口的方法。

  • 如果m_ShouldRecalculateClipRects为true,会调用 MaskUtilities.GetRectMasksForClip,把本对象和父对象中所有有效的RectMask2D,放入到m_Clippers中。
  • Clipping的FindCullAndClipWorldRect方法,遍历m_Clippers的canvasRect,取交集,取得一个最小的裁剪区域,如果这个裁剪区域不合理,validRect便为false,否则根据裁剪区域,返回一个Rect,同时设置validRect为true。
  • 新的clipRect如果与之前的不同,或者m_ForceClip为true,遍历m_ClipTargets,调用 clipTarget.SetClipRect,为他们设置裁剪区域,记录新的clipRect和validRect。
  • 最后,遍历m_ClipTargets,调用所有IClippable的Cull剔除方法。

猜你喜欢

转载自blog.csdn.net/qq826364410/article/details/88139894
今日推荐