首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九)
2015
03-18

UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九)

找到一个不用添加多个Camera在两个UI中叠加UI特效的方法。如下图所示,两个Image之间放了个UI特效。

UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九) - 雨松MOMO程序研究院 - 1

上代码:

原理就是设置 sortingOrder ,给需要修改order的UI元素挂上UIDepth脚本 。如下图所示,在UI容器中设置order。

注意: UI0 我设置了order =0 (可以不设置,因为默认所有UI的Order都是0)

           ParticleSystem 我设置了order =1 

           UI2 我设置了order =2 

所以效果是,UI2 挡住 ParticleSystem 挡住 UI0

UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九) - 雨松MOMO程序研究院 - 2欢迎大家提意见。互相讨论互相学习UGUI~,嘿嘿。

这段代码必须运行了才能看到效果。

补充一下 Unity5.3的粒子特效里已经有sortingOrder属性了,也就是说以后就不需要加Canvas组件了。如下图所示

 

UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九) - 雨松MOMO程序研究院 - 3

 

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

--

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

  1. 雨松老师你好,在这方面我有个疑问,上文所述方法,针对的是粒子特效,但是UI特效的制作时,并不是所有部分都是粒子,这个时候通过这个方法实现,就会出现一个特效中,其粒子部分正常,非粒子部分还是会被UI挡住,这种情况有什么好的解决方法吗?

      • 雨松老师你好,根据上文所述方案,我得到启示,canvas下分三个tag层(buttomLayer、NormalLayer和topLayer)来管理UI叠层,分别挂上canvas组件,sortingOrder分别为0,10,20,每个要挂在UI上的特效,其粒子的render对应的sortingOrder分别设置为UI所在tag层对应sortingOrder,这样就能很好的解决了特效与UI叠层冲突的问题,但是同时我发现一些bug,就是有些buttom层和normal层的UI,偶尔有时候渲染不出来!但不是必现的!雨松老师能不能指点一二 UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九) - 雨松MOMO程序研究院 - 1

  2. 你好,我想请问一下,sorting order和sorting layer本身是给unity 2D提供的,网上很多博客说它们的控制渲染顺序优先级比renderQueue还高,NGUI的panel的order和depth就证明了,但是我想不通为什么,sorting order和sorting layer到底控制了渲染中哪个属性了,请雨松大神解答一下?

  3. MeshRenderer m = GetComponent();m.sortingOrder = 10我使用这段代码修改了3d物体的MeshRenderer,为什么还是会被UI挡到

  4. hi雨松问下如果有粒子特效常驻场景中,如游戏中的一些充值活动按钮的闪光效果,那后续打开的功能类面板都要显示在这些闪光效果上面,是不是后续打开的面板都要加类似uidepth脚本处理叠层的关系呢,如果是的话,那就是场景中有粒子特效常驻显示的话,在打开显示的面板都要加canvas组件来处理夹层,累觉不爱啊

    • 我是这样做的, 因为不是所有界面都要有特效、大部分界面是没有特效的。 我做了一个脚本 给需要修改层级的加上这个脚本。 每个界面我会加100 .也就是这个界面下面的深度是 (N*100 ) + Order 自动把canvas 的order设置正确。 如果都没有的话 就不需要加这个canvas 一切都是自动的。。 所以 这样做界面的人不需要考虑多个界面夹层的问题。。

  5. 是不是可以这么理解:如果想在UGUI中显示特效就必须对所有UI的sortingOder进行管理?我之前的UI都是使用的默认sortingOrder,也就是都是0,现在用到特效了,是不是要对之前的UI的sortingOrder进行管理?我之前用的z值来控制的,本来想用z值就都用z值,用sortingOrder就都用sortingOrder这样逻辑清晰,如果答案是肯定的可能还需要改之前的逻辑。

      • 但是我的UI都是使用的默认sortingOrder都是0。粒子只能在所有UI最前面或者所有UI最后面显示,不能插入到中间某一层显示。我查了下资料,好像Canvas下的所有东西都在一个渲染层级中。所以会出现只能在UI最前或者最后显示粒子的问题。上面的方法确实能解决问题,但是,这个方法需要从项目初期就对sortingOrder有一个统一的管理才行,需要提前预留出哪些层是专门显示特效的。我现在的方法是我是用几个RectTransform作为container通过z值来进行的分层管理,但是粒子不认z值,只认renderqueue或者你上面方法中的sortingOrder。我理解的没问题吧?松神?我现在的问题是想根你确定一下,是不是如果我UI中想用粒子特效一定要对sortingOrder进行统一管理,并且提前预留出相应的order值区间?

  6. 如果特效可以做成一个组件就好了,类似CavansRenderer,管好界面和界面之间,界面和特效之间层级关系就方便了,但是貌似做不了[可怜]

  7. scrollview 在camera模式下不能使用 只能在overlay 或者 world 模式下才能用 ,如果在overlay模式下,少量特效可以rendertotexture去处理 但是如果多的话 那效率上就差太多了 world 模式下所有的UI布局缩放都被强制的改变了。。我想用到scrollview的同时用particul,momo大神有什么好办法么?

  8. 我现在的项目中,添加了多个层:ViewLayer/TipLayer/DialogLayer,每个层上挂一个UIDepth,在修改这些Layer下的Panel的SetActive属性时,内存会不断增加,请问momo有没有遇到这样的情况?这是unity3d的BUG吗?

  9. 我觉得2D的渲染顺序真是unity的一个硬伤,官方的说法是:渲染时会按SortingLayer再按SortingOrder,如果这些都一样,就优先渲染离摄像机近的(Depth),但是这个Depth怎么修改,我还没学会。如果Depth也没区别才按Z轴顺序。其实我觉得2D游戏的话直接用Z轴,不管是设计还是运行时层级都很清晰

  10. 多谢贡献, 在没有子目录的UI中可以正常,但是在一个UI控件包含有子UI控件时候,特效却和UI遮挡出现了混乱,怎么调都不对,请问大拿这个怎么处理呢?

  11. momo老师,这个脚本不能挂载在Button上吗?为什么挂载之后就不响应button事件了。我想用这个方法实现两个层级的按钮切换效果

    • UI组件的order默认是0,别挂UIDepth组件,比如你要在全屏UI背景上加个全屏UI特效,只需要在特效上加个UIDepth,order为-1,然后在背景图上加个为-2的。就不会遮挡界面的任何事件了

  12. momo 如果 特效和UI 是 在mask 下面的话 UI的image 不会显示 这是为何 ,找了好多资料都没解决 麻烦momo帮忙看下

  13. 雨松大拿,真心求教个问题,加多个Canvas会对性能有多大影响呢?比如像刀塔传奇那样的游戏,都是用Stack弹出式UI,如果每一层用一个Canvas会不会有问题呢?

  14. 假设我要用Mesh的特效(想用他做按钮边框流光效果),要他和UI的按钮一样大小,且在按钮上面(假设这个可以解决)。当按钮自适应屏幕后,大小和位置发生了变化。那么Mesh这个GameObject怎么弄呢(把他拉到按钮的孩子里,他只会改位置,不会改大小)。

  15. 感谢分享,我使用上面的代码,停止运行程序后会报以下的错误,请问该怎么解决呢m_TransformInfo.localAABB.IsValid()UnityEditor.DockArea:OnGUI()m_TransformInfo.worldAABB.IsValid()UnityEditor.DockArea:OnGUI()IsFinite(outDistanceForSort)UnityEditor.DockArea:OnGUI()IsFinite(outDistanceAlongView)UnityEditor.DockArea:OnGUI()

  16. 我的粒子系统在UGUI里面根本连显示都不显示。好像是被UGUI挡住了一样。雨凇大大,你试试移动你的粒子系统到其他位置试试?