首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之Mask裁切UI粒子特效或者3D模型(十七)
2015
06-02

UGUI研究院之Mask裁切UI粒子特效或者3D模型(十七)

刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下。其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTexture来做会有显示的问题,所以还是得用摄像机。废话不多说了,进入正题。

原理就是把Mask的裁切区域传给粒子特效Shader,当超出这个区域那么直接让它完全透明即可。粒子特效的源生shader大家可以去unity官网下载,我在这里把需要修改的地方标注给大家。

//add 注释中的内容就是我做修改的地方。

然后是自己写了个类继承Mask。把Mask的区域传给shader。

OK,如下图所示,把粒子特效直接挂在Mask下面, 就可以进行裁切了。。

UGUI研究院之Mask裁切UI粒子特效或者3D模型(十七) - 雨松MOMO程序研究院 - 1

在说一下3D模型, 理论上用上述的shader改一改就可以。 但是我还是建议3D模型用RenderTexture。比较好控制深度。

最后是工程的下载地址:http://pan.baidu.com/s/1pJFV5ph

希望大家可以多多测试一下,看看有没有问题。 或者你有更好的方法,欢迎在下面给我留言。谢谢啦~

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

    • 这个场景里面UiCamera有偏移导致的,代码里面RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, transform.position, canvas.camera, out pos)这个传的是transform.position,只有在UICamera位置为0的时候才可以,所以你把UICamera位置调到0显示就会对

  1. 拜读大神博客久矣。 一直仰慕!在下有一个方法可以更便捷的解决以上问题,也是我偶然翻查国外论坛找到的。创建两个Shader,一个给粒子用,一个给UI Mask 用,两个Shader的内容均采用Build-in Shader的Particle-Additive 和 UI-Default。利用Shader 的 Stencil 功能, 分别对两个Shader加入以下内容://UI Mask Stencil { Ref 1 Comp Always Pass Replace }//Paritcle Stencil { Ref 1 Comp equal }之后分别创建相应材质球,将其赋予UIImage 和 想被遮罩的 Particle 即可。 如果看不见效果,调整一下Particle的位置。 亲测可用。

  2. Unity3D 5.2.2 我这样写,如何?
    【C#】
    RectTransform rectTransform = transform as RectTransform;
    Vector2 min = rectTransform.TransformPoint(rectTransform.rect.min);
    Vector2 max = rectTransform.TransformPoint(rectTransform.rect.max);
    float minX = min.x;
    float minY = min.y;
    float maxX = max.x;
    float maxY = max.y;
    ParticleSystem[] pss = transform.GetComponentsInChildren();
    foreach (ParticleSystem ps in pss)
    {
    Material mat = ps.GetComponent().sharedMaterial;
    mat.SetFloat(“_MinX”, minX);
    mat.SetFloat(“_MinY”, minY);
    mat.SetFloat(“_MaxX”, maxX);
    mat.SetFloat(“_MaxY”, maxY);
    }

    【Shader】
    fixed4 col = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
    col.a *= (i.vpos.x >= _MinX && i.vpos.x = _MinY && i.vpos.y <= _MaxY) ? 1 : 0;
    return col;

  3. 雨松大大 你好。最近在关注UI上显示3D模型的问题,用的是UGUI。很多都在说关于用RenderTexture, 也有的说直接在canvas 的render mode 选 screen space-camera。请问究竟这两个哪个好呢?

  4. 雨松大大 unity版本升到5.2后 用您的示例代码裁切后的粒子特效y轴的位置会发生偏移(大小和x轴位置都正常),unity4.6没问题。试了好久都没发现是什么问题,您有试过或发现类似问题么?

  5. momo,好久不见。保重身体哦。关于你这篇文章我想问下,你的这个遮挡在手机上是否很耗性能。我了解的如果用NGUI,也可以通过UIPanel来完成你上面的遮挡,但是太贵。

  6. momo,好久不见。保重身体哦。关于你这篇文章我想问下,你的这个遮挡在手机上是否很耗性能。我了解的如果用NGUI,也可以通过UIPanel来完成你上面的遮挡。

  7. 大神,我发现新的ui做按钮点击很不方便,比如我的按钮样子是一个背景框加一个头像,那么如果我给背景框加button组件是没有用的,Graphic Raycaster捕捉到的是头像。有没有什么办法可以设置Graphic Raycaster只捕捉特定的ui元素。我看Graphic Raycaster有个Block Mask参数可以设定一个层,但是试了下发现不起作用。用Physics 2D Raycaster替代的话也很不方便,它是根据距离判断的,而ui是在同一距离的