unity使用UGUI特效裁剪

作者在游戏开发中遇到一个问题,UGUI中一个scroll view使用了mask组件,将带有特效的元素拖出裁减区域发现元素中的特效是无法裁剪的

分析原因,是因为mask的实现是用stencil buffer做的,而且mask下的节点是一起渲染的,渲染完毕mask就会清除,即使例子的material使用的shader支持stencil功能也无法正确的裁剪,mask在收集子物体的时候是不会考虑特效的,只会考虑UI元素,这样stencil对特效无法正确的生效导致mask组件无法裁剪特效

经过研究,可以使用新的裁剪组件rect  mask2d与sprite mask配合使用

使用默认的mask组件,效果如图

unity使用UGUI特效裁剪

可以看到粒子没有被正确的裁剪


而且在特效的renderer属性中,有一个参数叫

unity使用UGUI特效裁剪


勾选上之后,

额,竟然结果正确了

unity使用UGUI特效裁剪

尴尬,先别高兴太早,点下运行你就知道运气不会那么好了,UGUI的mask根本不考虑特效,他的mask在特效渲染的时候早就无效了,只有在非运行状态,stencil不会被立即清除的时候,才能看到效果,导致特效无法正确的显示

unity使用UGUI特效裁剪

实际原理很简单,mask把裁剪区域内的stencil buffer设置成1,区域外设置成0,他的子节点渲染会将不等于1的区域剔除,这是裁剪的基本原理,悲剧的是,等特效渲染的时候,mask设置的stencil buffer早就清除成0了,所以特效会显示不出来

直接公布结果吧

unity使用UGUI特效裁剪

第一步改造,用rect mask 2d裁剪组件替换 mask组件

第二部

首先,在canvas外创建一个GameObject,然后添加组件 sprite mask,最后拖入到UI合适的节点内

通过调整scale生成合适的大小

unity使用UGUI特效裁剪

unity使用UGUI特效裁剪

然后才是真的大功告成了

unity使用UGUI特效裁剪


呼呼哈哈