UGUI 粒子特效与UI层级问题
游戏中,界面上有些按钮之上需要放置一个特效,或者有些区域显示比如image上显示一个特效,这时候如果再打开一个UI,我们需要让新的UI显示在特效上层,而不是被特效遮挡,这是就需要设置特效的渲染顺序。
设置特效的order in layer,新版的unity中,particle system可以直接设置render的order,但是特效中有些是使用particle system做的,有些又是直接用的图像动画等等,而类似MeshRender的order in layer是不能在编辑器直接设置的,
所以靠手工设置是不现实的,需要用脚本设置。
代码:
// 深度遍历设置所有 Render 的 SortingLayer
public static void setRenderSortingLayerByActor(GameObject actor, int order, bool isRecursion)
{
if (null != actor)
{
UtilApi.setSpriteRenderSortingLayerByActor(actor, order);
UtilApi.setParticleSystemSortingLayerByActor(actor, order);
UtilApi.setMeshRenderSortingLayerByActor(actor, order); int childCount = actor.transform.childCount;
int idx = ;
Transform childTrans = null; if (isRecursion)
{
for (idx = ; idx < childCount; ++idx)
{
childTrans = actor.transform.GetChild(idx);
UtilApi.setRenderSortingLayerByActor(childTrans.gameObject, order, isRecursion);
}
}
}
} static public void setSpriteRenderSortingLayerByActor(UnityEngine.GameObject actor, int order)
{
if (null != actor)
{
SpriteRenderer render = null;
render = actor.GetComponent<SpriteRenderer>(); UtilApi.setSpriteRenderSortingLayerBySpriteRenderer(render, order);
}
} /**
* @brief unity渲染层级关系小结
* @ref http://blog.csdn.net/meegomeego/article/details/42060389
*/
// 可以在编辑器中设置
static public void setSpriteRenderSortingLayerBySpriteRenderer(SpriteRenderer render, int order)
{
if (null != render && render.sortingOrder != order)
{
render.sortingOrder = order;
}
} static public void setParticleSystemSortingLayerByActor(UnityEngine.GameObject actor, int order)
{
if (null != actor)
{
ParticleSystem particleSystem = null;
particleSystem = actor.GetComponent<ParticleSystem>(); UtilApi.setParticleSystemSortingLayer(particleSystem, order);
}
} // 不能在编辑器中设置
static public void setParticleSystemSortingLayer(ParticleSystem particleSystem, int order)
{
if (null != particleSystem)
{
Renderer render = particleSystem.GetComponent<Renderer>();
if (null != render && render.sortingOrder != order)
{
render.sortingOrder = order;
}
}
} static public void setMeshRenderSortingLayerByActor(UnityEngine.GameObject actor, int order)
{
if (null != actor)
{
UnityEngine.MeshRenderer meshRenderer = null;
meshRenderer = actor.GetComponent<UnityEngine.MeshRenderer>(); UtilApi.setMeshRenderSortingLayer(meshRenderer, order);
}
} // 不能在编辑器中设置
static public void setMeshRenderSortingLayer(UnityEngine.MeshRenderer meshRenderer, int order)
{
if (null != meshRenderer && meshRenderer.sortingOrder != order)
{
meshRenderer.sortingOrder = order;
}
}
使用时:UtilApi.setRenderSortingLayerByActor(this.mSelfGo, 1, true); 参数中,this.mSelfGo就是特效实例化的父节点,1就是设置的order in layer,因为ui的order默认都是0,所以这个设为1,true循环设置子节点
按理说这个order in layer设置为0我觉得应该也是正确的,但在我的游戏中设置为0就无法显示特效,我确实没有理解。
我的游戏结点如图:

ef_quan2all就是我的特效实例,按照这个顺序应该也是最后渲染的,不明白设置为0为何就不显示,不知有人能否告知。
order in layer设为1后,特效显示了,但是后面出现了一个问题,如果这时打开一个其他的UI,特效会遮挡这个UI,坑爹。。
这时就要使出杀手锏了,因为UI上类似Image或者Button是无法设置order in layer的,所以要给这个被遮挡的UI添加一个Canvas,Canvas可以设置order,那么将其设置为2,比特效的大,不错,可以显示了,但是又出现一个问题,这个界面上的按钮事件被拦截了,擦。。。
又一招出手,给其再设置一个Graphic Raycster,参数如下

终于完美了。。,既可以显示特效,还不会遮挡UI
至此有个问题,如果界面很多都需要设置上述的canvas,那就需要自己实现一个管理类,给每个ui设置它的order,不过canvas会影响合并批次,所以不能有太多,自己权衡。
UGUI 粒子特效与UI层级问题的更多相关文章
- UGUI中粒子特效与UI的遮挡问题
问题背景: 在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下 解决思路: 首先讲下影响渲染顺序的因素: 能够影响渲染顺序的因素有:1.Camera Depth ...
- Mask裁切UI粒子特效或者3D模型
刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTextur ...
- UGUI中显示粒子特效
今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下.原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sorting ...
- Unity中的粒子特效的 RendererQ 排序
这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...
- UGUI的优点新UI系统
UGUI的优点新UI系统 第1章 新UI系统概述 UGUI的优点新UI系统,新的UI系统相较于旧的UI系统而言,是一个巨大的飞跃!有过旧UI系统使用体验的开发者,大部分都对它没有任何好感,以至于在过 ...
- 【Stage3D学习笔记续】真正的3D世界(五):粒子特效
先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码 ...
- JParticles 2.0 发布,打造炫酷的粒子特效
JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2 ...
- js实现粒子特效,particles.js的使用
今天偶然看到了一个比较炫酷的js网页.是粒子特效的,就试着用了用.一下是步骤,方便以后查看使用. 1.在网站下载源码https://github.com/VincentGarreau/particle ...
- [原][粒子特效][spark]调节器modifier
深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group添加modifier的方式: modifier An abstra ...
随机推荐
- RxJava开发精要6 - 组合Observables
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发人员头条享有独家 ...
- stanford-parser for C#
在项目里用到C#对英文句子进行词性标注.比較成熟的英文词性标注软件是stanford-parser.它个C#版本号,也是借助于IKVM完毕JAVA-C#的转换.详细配置过程例如以下: 1.下载stan ...
- C3P0 APPARENT DEADLOCK
一,c3p0执行一段时间后报错例如以下 W 07-26_00:58:27 ThreadPoolAsynchronousRunner.java 608 com.mchange.v2.async.Thre ...
- 主次设备号 Device Major and Minor Numbers
对于一个设备文件而言真正重要的标志是它的主次设备号(major and minor device numbers).如果我们用ls命令列出/dev下的一个设备: frank@under:~$ ls - ...
- MongoDB学习笔记(一)
最近有些时间,就抽空研究了一下MongoDB,我以前经常使用关系型数据库,如Oracle.MySQL,对MongoDB只是有些很肤浅的了解,最近下决心要好好研究一下,主要的参考书有两本:<Mon ...
- 《TCP-IP详解卷1:协议》【PDF】下载
<TCP-IP详解卷1:协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介<TCP/IP详解卷1:协 ...
- Visual Studio 实用技能
1快捷键使用 1. Ctrl K F 代码对齐
- Python网络爬虫与信息提取(三)—— Re模块
regular expression / regex / RE 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 ...
- iOS Swift--UIImageView UIImage
1.UIImageView + UIImage Demo import UIKit class UIImageViewViewController: UIViewController { var ...
- ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】
要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲 ...