游戏中,界面上有些按钮之上需要放置一个特效,或者有些区域显示比如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层级问题的更多相关文章

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

    问题背景: 在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下 解决思路: 首先讲下影响渲染顺序的因素: 能够影响渲染顺序的因素有:1.Camera Depth  ...

  2. Mask裁切UI粒子特效或者3D模型

    刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTextur ...

  3. UGUI中显示粒子特效

    今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下.原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sorting ...

  4. Unity中的粒子特效的 RendererQ 排序

    这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...

  5. UGUI的优点新UI系统

    UGUI的优点新UI系统 第1章  新UI系统概述 UGUI的优点新UI系统,新的UI系统相较于旧的UI系统而言,是一个巨大的飞跃!有过旧UI系统使用体验的开发者,大部分都对它没有任何好感,以至于在过 ...

  6. 【Stage3D学习笔记续】真正的3D世界(五):粒子特效

    先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码 ...

  7. JParticles 2.0 发布,打造炫酷的粒子特效

    JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2 ...

  8. js实现粒子特效,particles.js的使用

    今天偶然看到了一个比较炫酷的js网页.是粒子特效的,就试着用了用.一下是步骤,方便以后查看使用. 1.在网站下载源码https://github.com/VincentGarreau/particle ...

  9. [原][粒子特效][spark]调节器modifier

    深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group添加modifier的方式: modifier An abstra ...

随机推荐

  1. 一行代码搞定ThoughtWorks面试题

    今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师.在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课 ...

  2. 树莓派学习笔记——USB wifi配置指南

    0 前言     树莓派既能够使用有线网络又能够无线网络,假设使用有线网络不方便的话能够借助USB wifi无线网卡让树莓派也插上无线"翅膀". 可是和使用有线网络即插即用的方式不 ...

  3. HTTP Status 500 - Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement

    1.什么操作出现:当我在项目中添加产品或者修改时,浏览器出现HTTP Status 500 - Request processing failed; nested exception is org.h ...

  4. 【SqlServer系列】JSON数据

    1   概述 本文将结合MSDN简要概述JSON数据. 2   具体内容 JSON 是一种流行的数据格式,用于在现代 Web 和移动应用程序中交换数据. JSON 还可用于在 Microsoft Az ...

  5. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. 快收藏!高手Linux运维管理必备工具大全,你会吗?

    一.统一账号管理 1.LDAP 统一管理各种平台帐号和密码,包括但不限于各种操作系统(Windows.Linux),Linux系统sudo集成,系统用户分组,主机登入限制等:可与Apache,HTTP ...

  7. Github开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  8. 【python】列表

    >>> mix = [2,3.4,"abc",'中国',True,['ab',23]]>>> mix[2, 3.4, 'abc', '中国', ...

  9. 【NOIP模拟】【USACO】 Bovine Genomics

    Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...

  10. 实现WebSocket和WAMP协议的开源库WampSharp

    Websocket Application Messaging Protocol 协议:https://github.com/wamp-proto/wamp-proto 1. 基础档案 引入: WAM ...