带CanvasUI是不在剪裁的目标之内的,所以需要一个中介自身是剪裁目标的,然后获取到这些带Canvas的UI通知它们也做相应处理。
Proxy的脚本为:
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; [DisallowMultipleComponent] public class RectMask2DClipProxy : MaskableGraphic { private List<MaskableGraphic> _maskableList; protected RectMask2DClipProxy() { useLegacyMeshGeneration = false; } protected override void OnPopulateMesh(VertexHelper toFill) { toFill.Clear(); } protected override void Awake() { base.Awake(); _maskableList = new List<MaskableGraphic>(); } public override void Cull(Rect clipRect, bool validRect) { base.Cull(clipRect, validRect); GetComponentsInChildren(false, _maskableList); if (null != _maskableList) { for (int i = 0; i < _maskableList.Count; i++) { var maskable = _maskableList[i]; if (maskable != null && maskable != this) { maskable.Cull(clipRect, validRect); } } } } public override void SetClipRect(Rect clipRect, bool validRect) { base.SetClipRect(clipRect, validRect); GetComponentsInChildren(false, _maskableList); if (null != _maskableList) { for (int i = 0; i < _maskableList.Count; i++) { var maskable = _maskableList[i]; if (maskable != null && maskable != this) { maskable.SetClipRect(clipRect, validRect); } } } } }
如果元素不是动态变化的,就缓存起来。