zoukankan      html  css  js  c++  java
  • 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了。

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

  • 相关阅读:
    tomcat启动与关闭脚本
    SqlAlchemy ORM
    python之socket
    python异常处理
    python常用模块
    PYTHON之文件操作
    Linux系统Load average负载详细解释
    tomcat报错:This is very likely to create a memory leak问题解决
    springcloud第一步:创建eureka注册服务
    SpringCloud微服务高级
  • 原文地址:https://www.cnblogs.com/answer-yj/p/10758578.html
Copyright © 2011-2022 走看看