问题:在滑动列表中选中Item的效果是一个特效,但是当滑动出了Mask的裁剪范围内时特效并未被裁剪掉。
解决办法有两个:
1、在滑动列表的节点下添加一个空节点(和挂载Mask的节点平级),挂载上SpriteMask组件,此时需要设置RectTransform上的裁剪范围,这个的范围确定是由Scale调整的,修改宽高并没有效果。可以代码中动态根据列表的大小设置Scale的值,缩放值和UI元素之间的大小比率为100倍。
public void SetSpriteMaskScale() {
// 获取裁剪区域的宽高
RectTransform scrollRectTran = scrollRect.GetComponent<RectTransform>();
float rectWidth = scrollRectTran.rect.width;
float rectHeight = scrollRectTran.rect.height;
// 获取裁剪精灵的宽高
SpriteMask spriteMask = gameObject.GetComponentInChildren<SpriteMask>();
float spriteWidth = spriteMask.sprite.rect.width;
float spriteHeight = spriteMask.sprite.rect.height;
// 计算宽高比获取缩放值的大小
float scaleX = ( rectWidth / spriteWidth ) * 100;
float scaleY = ( rectHeight / spriteHeight ) * 100;
// 设置裁剪范围
spriteMask.gameObject.transform.localScale = new Vector2( scaleX, scaleY );
Debug.LogError( $"rectWidth:{rectWidth} " +
$"rectHeight:{rectHeight} " +
$"spriteWidth:{spriteWidth} " +
$"spriteHeight:{spriteHeight} " +
$"scaleX:{scaleX} " +
$"scaleY:{scaleY}" );
}
此时还需要设置特效的Renderer属性为VisibleInsideMask
ps:设置初始裁剪范围,不动态调整裁剪范围。
若不调整SpriteMask的裁剪范围会造成UI的Mask裁剪范围错误,此时可以调整特效的渲染层级,使其只裁剪特效,给特效添加SoringGroup
然后在SpriteMask中调整设置自定义范围,此时并没有动态修改裁剪范围,但是裁剪的层级限定了范围
2、修改shader,每一个需要裁剪的特效都需要设置相关属性,此方法未实现,可以搜一下网上有相关案例。