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

为了做出更酷炫的的UI效果,通常要在UI中加入粒子效果。但与纯2D的UI动画或Spine不同,粒子在场景中制作,会存在与UI的穿插问题。本文探讨如何更改特效或UI的SortingOrder避免穿插。

前提条件

首先,Canvas的类型是一切的基础,我使用的Canvas是Screen-Space ,所有UI通过一个正交摄像机照出来。制作UI通常使用这种模式,本文不讨论其他情况。

核心原理

通过更改渲染的顺序来改变遮挡关系。一方面UGUI会根据Hierarchy中的控件顺序进行排序。因此对于Animation或Spine制作的UI动画,只要顺序正确,就可以保证遮挡关系正确。对于使用ParticleSystem制作的特效,它是使用Render进行渲染,因此需要找到一个能够同时影响Render和UI控件渲染层次的方法。这个方法就是更改SortLayer或SortingOrder。这两种方法原理一样,先排序,再渲染。这个排序通过SortingOrder更改,而排序和排序之前可以通过SortLayer来分隔。以我目前的经验,使用SortingOrder足够,还没有用到SortLayer。

案例

为了说的更清楚我制作了个简单的例子,效果如下图所示:

它在Hierarchy中的层级关系如下:

不难看出,界面层级关系很简单。大体上分为左区域、右区域、标题三部分,每部分中都包含底图。左右区域分别有两个按钮。最终效果是左侧的区域完全被特效覆盖,右侧区域底图被特效覆盖,按钮在特效上层,标题区域所有内容显示在特效上。其中所有UI使用标准UGUI材质,粒子特效使用系统自带Particles/Additive

详解

如第二节核心原理所述,我需要规划出SortingOrder。为了达到这个效果,左侧区域使用默认的SortingOrder,也就是0。粒子使用1,即SortingOrder+1。右侧区域Button和整个Title使用SortingOrder+2。

粒子设置

ParticleSystem中,找到Render更改它的SortingOrder为1:

UI设置

UGUI中SortingOrder变量定义在Canvas中,因此需要是该类或其子类才能实现设置。这里需要为Button1和Title添加一个Canvas。因为Canvas也会附带更改它子节点的层级,所以Title下面的SortingOrder都会被改好。另外,如果要传递点击事件记得加入GraphicRaycaster

以上就是所有设置,播放粒子是效果图的效果了。

警告

即使SortingOrder相同也无法将不同Canvas的DarwCall合并,所以要尽可能的减少Canvas。尽量不要在加入特效时通过动态添加Canvas,来更改UI的SortingOrder。这样做会使UI中的Canvas不可控,不利于后期DrawCall优化。最好根据自己项目提前做好UI分层,从设计上处理好SortingOrder

关注我的微信公众号,获取更多优质内容

时间: 2024-10-14 13:09:49

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

Cocos2d-x 3.2 大富翁游戏项目开发-第十九部分 国际化-解决中文乱码

先解决一下中文乱码问题吧,网友cheyiliu 提供了比较简单的解决办法,具体如下,如有更好方法,欢迎提供 1. 编写plist文件string_zh.plist把需要中文显示字符,放入到该文件中: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://ww

Unity3D开发(九):Unity3d流光效果

向原创致敬http://blog.csdn.net/onerain88/article/details/19939181 之前曾经注意过Material中纹理的属性都有Tiling和Offset,但没有深究过其用途,今天才知道竟然可以利用Offset做uv动画,从而完成各种有趣的动画,比如流光效果! 流过效果即通常一条高光光在物体上划过,模拟高光移动照射物体的效果,之前是使用Shader每帧传递一个Offset值,修改高光纹理采样的uv,从而达到其效果.这样的敝处在于需要自己实现Shader,简

JAVA card 应用开发(九)APDU脚本命令中MAC的校验

终端从后台接收到71或72脚本,解析出脚本指令,发给卡片. 卡片执行该脚本指令,首先要验证MAC,MAC验证通过,才真正执行脚本.因为脚本一般都是更新数据,锁定/解锁应用等敏感操作,所以必须有MAC进行保护. MAC数据计算的大致过程为: 发卡行有主密钥.在发卡的时候,发卡行把主密钥根据卡号分散,卡片得到分散密钥.交易过程中,发卡行接收到包含卡号的交易数据,通过主密钥,根据卡号得到分散密钥,根据ATC和分散密钥,得到过程密钥,使用过程密钥加密数据,得到MAC.而卡片本身已经存储有分散密钥,在交易

linux平台学x86汇编(十九):C语言中调用汇编函数

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 除了内联汇编以外,还有一种途径可以把汇编代码整合到C/C++语言中,C/C++语言可以直接调用汇编函数,把输入值传递给函数,然后从函数获得输出值. 如果希望汇编语言函数和C/C++程序一起工作,就必须显示地遵守C样式的函数格式,也就是说所有输入变量都必须从堆栈读取,并且大多数输入值都返回到EAX嫁寄存器中.在汇编函数代码中,C样式函数对于可以修改哪些寄存器和函数必须保留哪些寄

(三十)unity4.6学习Ugui中文文档-------制作一个泛型的MODAL窗口

孙广东 2015.5.11 在此文章中我们将制作一个泛型的MODAL窗口 (Yes, No, Maybeso, Cancel) 在那里我们可以把内容和动作push到窗口中,这个窗口可以在我们的游戏的任何地方使用,按钮被按下时事件工作. 涉及到的代码: using UnityEngine; using System.Collections; public class BringToFront : MonoBehaviour { void OnEnable () { transform.SetAsL

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

问题背景: 在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下 解决思路: 首先讲下影响渲染顺序的因素: 能够影响渲染顺序的因素有:1.Camera Depth     相机组件上设置的相机深度,深度越大越靠后渲染. 2.Sorting Layer      在Tags & Layers设置中可见 3.Order In Layer 相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效.4.RenderQueue     Shade

unity3d开发实战《啪啪三国》技术详解!

去年11月,上海火溶网络CEO王伟峰以其第一款3d手游产品<啪啪三国>为例,着重讲解了unity3D手机网游开发的经验,其中涉及了团队组成.人员要求.常见的unity3d开发遇到的坑及解决办法.在演讲中,王伟峰也贡献了<啪啪三国>开发过程中总结的各种经验,从优化.插件库.服务器架构.SDK等很多细节进行了讲解.值得一说的是,王伟峰现场演讲十分幽默,冷笑话段子不断爆出,让在场观众在连续的笑声中听完这个特别的技术演讲. <ignore_js_op> 以下是王伟峰现场演讲实录

QT开发(十九)——QT内存泄漏问题

QT开发(十九)--QT内存泄漏问题 一.QT对象间的父子关系 QT最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children. QT对象之间可以存在父子关系,每一个对象都可以保存它所有子对象的指针,每一个对象都有一个指向其父对象的指针. 当指定QT对象的父对象时,父对象会在子对象链表中加入该对象的指针,该对象会保存指向其父对象的指针. 当QT对象被销毁时,

我的编程之路(十九) 开发中一些细节与启发

1.js的命名空间           如果写后台代码,分层是潜意识中的基本常识,但是一到了前台,却没了这种意识,归根结底还是js用的不多,也一直没有在意js的地位,直到现在富客户端的趋势与要求,使得很多代码都要在前台用js或其框架完成,所以对于js代码的管理就要像后台java代码一样有其规范了,而命名空间就是package,也是为了管理不同层次的代码. 2.闭包          闭包就是能够读取其他函数内部变量的函数.它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值