带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);
}
}
}
}
}
如果元素不是动态变化的,就缓存起来。