找到一个不用添加多个Camera在两个UI中叠加UI特效的方法。如下图所示,两个Image之间放了个UI特效。
上代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class UIDepth : MonoBehaviour {
public int order;
public bool isUI = true;
void Start ()
{
if(isUI){
Canvas canvas = GetComponent<Canvas>();
if( canvas == null){
canvas = gameObject.AddComponent<Canvas>();
}
canvas.overrideSorting = true;
canvas.sortingOrder = order;
}
else
{
Renderer []renders = GetComponentsInChildren<Renderer>();
foreach(Renderer render in renders){
render.sortingOrder = order;
}
}
}
}
原理就是设置 sortingOrder ,给需要修改order的UI元素挂上UIDepth脚本 。如下图所示,在UI容器中设置order。
注意: UI0 我设置了order =0 (可以不设置,因为默认所有UI的Order都是0)
ParticleSystem 我设置了order =1
UI2 我设置了order =2
所以效果是,UI2 挡住 ParticleSystem 挡住 UI0
这段代码必须运行了才能看到效果。
补充一下 Unity5.3的粒子特效里已经有sortingOrder属性了,也就是说以后就不需要加Canvas组件了。如下图所示
- 本文固定链接: https://www.xuanyusong.com/archives/3435
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!




momo 如果 特效和UI 是 在mask 下面的话 UI的image 不会显示 这是为何 ,找了好多资料都没解决 麻烦momo帮忙看下
UI会被遮住, 但是特效 不会被遮住才对啊。。
特效是不会遮住的 我是想UI被遮住的问题 有啥解决办法么 因为UI 添加了canvas 组件后 就被遮了
mask的功能本来就是裁切啊。 mask上会记录裁切的区域。 如果mask下面的image text rawImage 大于这个裁切区域 就会自动被裁切。 如果你不想被裁切 就别放在mask下面就行了。
请问你这个问题解决了吗?
貌似isUI不管为true还是false都不影响最终效果?
运行时看, 没问题的。。
加了canvas之后点击事件捕捉不到,怎么解决?
因为没添加鼠标穿透组建所以才会:Graphic Raycaster
momo你的demo项目能发一下么 我按照你的步骤做了 但是不行
我按照步骤尝试了,但是粒子特效还是依旧显示在上方,并没有在两个界面之间
可能你做得有问题吧? 我已经用了很久了 很正常啊。。
雨松momo,可以加你Q吗?
我猜你没有把UIDepth添加到其余两个UI上
先点个赞,但是这种用法在模拟器里没问题,到手机上面就又给遮挡了
啊, 我在手机上已经用了没问题啊。
你好,请问你按照这种方法做,可以实现该效果吗?
修改renderQueue可以达到不添加摄像机,让特效在两个UI间显示
原理是一样的,NGUI以前就是用renderQueue的。。
请教用renderqueue要怎么做?
雨松大拿,真心求教个问题,加多个Canvas会对性能有多大影响呢?比如像刀塔传奇那样的游戏,都是用Stack弹出式UI,如果每一层用一个Canvas会不会有问题呢?
最好别这样。。 只有特殊情况在需要加canvas
请问为什么有两个摄像机?分别是如何使用的?
一个是UI摄像机 一个是3D摄像机。。
我也試不出來,大大能提供個範例專案嗎?
假设我要用Mesh的特效(想用他做按钮边框流光效果),要他和UI的按钮一样大小,且在按钮上面(假设这个可以解决)。当按钮自适应屏幕后,大小和位置发生了变化。那么Mesh这个GameObject怎么弄呢(把他拉到按钮的孩子里,他只会改位置,不会改大小)。
自适应不是改摄像机么? 为什么按钮还会发生变化?
感谢分享,我使用上面的代码,停止运行程序后会报以下的错误,请问该怎么解决呢m_TransformInfo.localAABB.IsValid()UnityEditor.DockArea:OnGUI()m_TransformInfo.worldAABB.IsValid()UnityEditor.DockArea:OnGUI()IsFinite(outDistanceForSort)UnityEditor.DockArea:OnGUI()IsFinite(outDistanceAlongView)UnityEditor.DockArea:OnGUI()
用4.6.3 吧 这是底层错误。。
不能用,麻烦把工程给下吧。
我的粒子系统在UGUI里面根本连显示都不显示。好像是被UGUI挡住了一样。雨凇大大,你试试移动你的粒子系统到其他位置试试?
你的粒子层要设置成UI层
你把摄像机改成正交的试试?
示例工程可以发一下不?我用的一直有问题
这个有个非常大的缺陷哎,每个在这物体上的物体都要加个UIDepth吧,而且还要加Canvas
看怎么用了。 不用给每个物体挂, 给父节点挂就行了。这种叠层需求的地方也比较少。特殊处理一下吧。。
这个方法,上下两个UGUI的图片需要在同一个CANVAS里还是两个sortingOrder不同的两个CANVAS下呢
都可以, 但是 默认order都是0 所以设置了新的order以后, 会盖在默认UI上面, 如果上面还要在弹出UI 那么就要处理order了。。
赞一个
Canvas的Render Mode得设置成Screen Space – Camera,我刚开始用的第一个无效……
刚刚开始先就UGUI,给MOMO点个赞
= =学习