privatebool m_shouldRecalculateClipRects = false; private Rect m_prevClipRect = default;
publicvoidPerformClipping() { // IDK why unity use ReferenceEquals, I just copied it from RectMask2D.cs :( if (ReferenceEquals(_canvas, null) || null == _clipTarget) { return; }
RectTransform selfTransform = transform as RectTransform; RectTransform clipTargetTransform = _clipTarget.transform as RectTransform; if (RectTransformEx.IsNotIntersetedWithTargetRect(selfTransform, clipTargetTransform)) { CancelClip(); m_prevClipRect = default; m_shouldRecalculateClipRects = false; return; }
Rect clipRect = selfTransform.rect; Vector2 selfPivot = selfTransform.pivot; // Get pivot position from clip rect if (RectTransformEx.TryCalculateLocalPositionInAnotherRect(selfTransform, clipTargetTransform, null, out Vector2 tempLocalPos)) { clipRect.position = tempLocalPos; } else// Can not calculate, maybe canvas is invalid { CancelClip(); m_prevClipRect = default; m_shouldRecalculateClipRects = false; return; }
// For clip rect, the pivot is at bottom left, need to adjust position Vector2 delta = new Vector2(-clipRect.width * selfPivot.x, -clipRect.height * selfPivot.y); clipRect.position += delta;
// IDK if it is needed to clamp the clip rect Rect clipTargetRect = clipTargetTransform.rect; clipRect.xMin = Mathf.Clamp(clipRect.xMin, clipTargetRect.xMin, clipTargetRect.xMax); clipRect.xMax = Mathf.Clamp(clipRect.xMax, clipTargetRect.xMin, clipTargetRect.xMax); clipRect.yMin = Mathf.Clamp(clipRect.yMin, clipTargetRect.yMin, clipTargetRect.yMax); clipRect.yMax = Mathf.Clamp(clipRect.yMax, clipTargetRect.yMin, clipTargetRect.yMax);
publicboolIsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { if (_cutRects == null || _cutRects.Length == 0) { returnfalse; }
for (int i = 0, length = _cutRects.Length; i < length; i++) { if (RectTransformUtility.RectangleContainsScreenPoint(_cutRects[i], screenPoint, eventCamera)) { returnfalse; // Pass it } }