问题背景:
在做主线任务时发现完成任务后的特效显示穿透上面的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了。
新手上路,很多都是不解原理,达不到对症下药,只知道这种病症症状这种药可缓解,欢迎各位前辈指点提携