首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一)
2019
01-12

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一)

前两个项目我一直用的是 UGUI研究院之Mask裁切UI粒子特效或者3D模型(十七) 做的裁切,但是实际开发中由循环列表中需要动态创建元素,每个新创建的元素都需要根据MaskRect的区域重新给Shader中指定,这个小小的隐患总是引起BUG。最近在做技术储备看到了Stencil一个东西,发现可以很好的代替原来裁切的方法,如下图所示,一共有2个裁切区域,同时裁切 UI 模型 粒子特效。

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一) - 雨松MOMO程序研究院 - 1

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一) - 雨松MOMO程序研究院 - 2

首先无论怎么做,我觉得需要一个脚本,只需要将模型 UI 特效挂在下面就可以全部裁切,运行期间动态添加不需要调用刷新方法。如下图所示,添加一个新的脚本RectMask3D来代替UGUI自带的RectMask2D

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一) - 雨松MOMO程序研究院 - 3

RectMask3D.cs 代码中的m_ID是为了区分裁切区域,大部分情况下裁切区域都是一致的,当然也不排除有重叠的情况,就像最上面的图一样。

m_Material 是裁切3D所需要的,Shader中需要Stencil,为了避免每次添加一个新的裁切区域手动绑定,可以提前挂在Inspector面板上。

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一) - 雨松MOMO程序研究院 - 4
Mask.shader

接着就是Mask裁切的元素了,由于脚本继承了RectMask2D所以自带就可以裁切UI,需要处理的就是特效和模型,这里我用特效来举例,其他的做法都类似。给参与裁切的特效或者模型绑定RectImage3D脚本,(也可以不绑定,主要就是ID的值需要和RectMask3D里填的一致)。Type枚举可以设置永远显示(Always)或者被裁切(Equal)

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一) - 雨松MOMO程序研究院 - 5
RectItem3D.cs

同样还需要给粒子或者模型绑定新的Shader,这里我就举个简单的粒子,将//—-add—-中间的代码添加到需要裁切的模型或者粒子的Shader中。

这样需要裁切的粒子或者模型就可以保证只使用同一个Shader,运行时代码灵活的控制。

最后说说我的总结:

1.我还是建议模型使用RT,因为UI界面需要叠层挡住模型的现象,关于AlphaBlend或者显示不清楚的现象,可以参考我之前的文章 UGUI研究院之在UI上使用RenderTexture显示模型+AlphaBlend特效(二十五)

2.粒子特效适合使用这篇文章的方法,其实UI的粒子特效需要裁切的 无非就是 滑动列表中的图标上的转圈特效,配合SortOrder可以很好解决层级的问题。

3.RectTransform的Scale是(1,1,1) 但是模板需要添加scale的区域,我不知道怎么可以和RectTransform公用一个,所以我不得不创建一个和RectTransform区域相同的m_Mask3D,如果有知道的朋友欢迎告诉我。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

UGUI研究院之一个脚本同时裁切UI元素和粒子特效和3D模型(三十一)》有 6 条评论

  1. 芒果酱 说:

    雨松大大, 我用了这个裁切 ,但是shader 在安卓和ios 手机上提示不支持GPU, Mobile/Particles/AdditiveMask shader is not supported on this GPU (none of subshaders/fallbacks are suitable)

  2. 周安飞 说:

    m_Mask3D.transform.SetParent(transform); 报错Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: ‘Mask3D’).

  3. CF 说:

    工程能否发出来参考一下?

  4. xx 说:

    这样用应该更简单而且有效,你觉得呢?
    Shader.SetGlobalVector(“_MaskClip”, new Vector4(200,200,200));

  5. HBPP 说:

    请问大大,我在UGUI的滑动列表中的Viewport那里使用了这个方案,把UGUI的Mask组件删除替换成了RectMask3D
    但只有列表的第一项里的特效可以被裁切,之后的列表项目里的特效就不会被裁切了,怎么办?

留下一个回复

你的email不会被公开。