RectMask2D剪裁带Canvas的UI

带CanvasUI是不在剪裁的目标之内的,所以需要一个中介自身是剪裁目标的,然后获取到这些带Canvas的UI通知它们也做相应处理。

image.png


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);
                }
            }
        }
    }
}


如果元素不是动态变化的,就缓存起来。


首页 我的博客
粤ICP备17103704号