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 ...
随机推荐
- Juel 表达式使用
JUEL 包的结构例如以下: 1.1.1. Juel maven仓库配置 眼下最新的版本号是2.2.7.使用的时候在pom.xml中加入仓库坐标就可以. <dependency> < ...
- Dell poweredge r210进BIOS改动磁盘控制器(SATA Controller)接口模式
Dell poweredge r210进BIOS改动磁盘控制器(SATA Controller)接口模式 开机后按F2键进入BIOS设置,例如以下图: BIOS设置主界面: 使用上下键移动光标到&qu ...
- 《深入理解java虚拟机》笔记——简析java类文件结构
一直不太搞得明确jvm究竟是如何进行类载入的,在看资料的过程中迷迷糊糊.在理解类载入之前,首先看看java的类文件结构究竟是如何的,都包含了哪些内容. 最直接的參考当然是官方文档:The Java® ...
- ML学习分享系列(2)_计算广告小窥[中]
原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 ...
- HTTP请求中怎样选择Get和Post方式
在应用中最经常使用的Http请求无非是get和post,get请求能够获取静态页面,也能够把參数放在URL字串后面,传递给servlet.post与get的不同之处在于post的參数不是放在URL字串 ...
- css实现垂直水平居中的5种方法
css实现垂直水平居中的5种方法 给父元素设置table-cell,text-align,vertical-align #big{ width: 200px; height: 200px; borde ...
- Elasticsearch和MongoDB分片及高可用对比
本文旨在对比Elasticsearch和MongoDB高可用和分片的实现机制. Elasticsearch ES天生就是分布式的,那她又是如何做到天生分布式的? 通过ES官方指南我们可以知道: 一个运 ...
- nginx+zuul
最近将公司的一些服务迁移到spring cloud了,感觉zuul智能路由的功能非常好用,比以前手动在nginx中添加localtion,upstream方便多了,但是服务域名的80端口被ngin ...
- MyBatis 批量操作、集合遍历-foreach
在使用mybatis操作数据库时,经常会使用到批量插入.IN条件查询的情况,这时就难免要使用到foreach元素.下面一段话摘自mybatis官网: foreach 元素的功能是非常强大的,它允许你指 ...
- Django项目创建02
Django项目创建(ubuntu环境) 1. 创建项目目录,我是在root下创建了一个workspace文件夹:mkdir workspace 然后cd到该目录下 命令:django-adm ...