UGUI中粒子特效与UI的遮挡问题

Posted answer-yj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UGUI中粒子特效与UI的遮挡问题相关的知识,希望对你有一定的参考价值。

问题背景:

技术图片

在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下

解决思路:

首先讲下影响渲染顺序的因素:

能够影响渲染顺序的因素有:
1、Camera Depth
     相机组件上设置的相机深度,深度越大越靠后渲染。

2、Sorting Layer
      在Tags & Layers设置中可见

技术图片

 

3、Order In Layer

      相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
4、RenderQueue
     Shader中对Tags设置的“Queue”。

影响程度:

1、Camera Depth
     永远最高。Camera Depth小的一定先进渲染管线。

2、当Sorting Layer和Order In Layer相同时
     RenderQueue小的先进渲染管线。

3、当Sorting Layer和Order In Layer不相同时!两种情况
     1. 当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。
     2. 当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在[0~2500]和[2501~5000]时,则一定会按照RenderQueue绘制,无视SortingLayer、OrderInLayer的排序。

在这只说两种:

1.调节粒子系统Particle System中Order in Layer

技术图片

这里注意下Sorting Layer和Order in Layer 的区别

在Sorting Layer中可以Add Sorting Layer ,显示的优先级为从上到下 (不同层)。

在 Order in Layer 中我们可以指定同一层Sorting Layer 的优先级(同一层级)

比如 两个游戏物体的Sorting Layer同为role层 ,但是第一个游戏物体的Order in Layer 为0,而第二个游戏物体的Order in Layer 为1 ,则第二个游戏物体的显示优先级高于第一个游戏物体。
不过研究发现,此方式使用2DSprite,通过层级设置,但是Image不行

2.粒子系统的渲染队列Render Queue

 我在这里采取了这种方式,是这样,策划的要求是不能动当前粒子特效自身的效果,并且有上层UI时不能穿透

首先不能动当前粒子特效的效果也就意味这,显示特效时如果调了特效的渲染队列,就变了特效的效果,第二有上层UI时还不能穿透,我就想那就动态控制下这粒子的渲染队列吧,这地方也简单,就是有上层UI时和没有时切换下状态就OK了

查看了下美术的粒子效果时shader中的渲染队列值分别如图:

技术图片

并且自己手动调整了下看了下达到策划需求时的渲染队列值要小于3001即可,其子特效如下:

技术图片

是3000,而要求是低于2900才可以达到效果。

好不多说,代码很简单。

具体代码:

 1     Coroutine ControlEffectRenderCor;
 2     IEnumerator FindControlEffectRender(int QueueValueOne,int QueueValueTwo)
 3     {
 4         while (ControlEffectRender==null)
 5         {
 6             yield return null;
 7         }
 8       Material[] materArr= ControlEffectRender.GetComponent<ParticleSystem>().GetComponent<Renderer>().materials;
 9         for (int i = 0; i < materArr.Length; i++)
10         {
11             materArr[i].renderQueue = QueueValueOne;
12         }
13         ControlEffectRender.transform.GetChild(0).GetComponent<ParticleSystem>().GetComponent<Renderer>().material.renderQueue = QueueValueTwo;
14     }

就这个简单的函数实现,

这里ControlEffectRender指的是特效GameObject,这样就OK了。

 新手上路,很多都是不解原理,达不到对症下药,只知道这种病症症状这种药可缓解,欢迎各位前辈指点提携

 

以上是关于UGUI中粒子特效与UI的遮挡问题的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d开发(十九)调整SortingOrder解决UGUI中粒子层级问题

UGUI 特效怎样在UI上裁剪

Unity之UGUI-特效遮挡问题2.0

滑动列表中使用粒子特效层级问题

滑动列表中使用粒子特效层级问题

滑动列表中使用粒子特效层级问题