新人求教关于unity中layer层级的unity layer 设置层级问题

UGUI在Screen Space - Overlay渲染模式下,由于不依赖摄像机渲染,使得其无法通过修改Z轴的方式修改物体间的层级关系,以下是解决方案:
我创建了一个空的工程,然后创建了一个Image,然后复制成了一样大小的四份 为了便于分辨,设置为不同的颜色,改变他们的位置,使之相互交叉遮挡
根据运行结果看,每当点击一个图片,它在Hierarchy视图中的顺序会被改变,而且在场景中会被放置到最顶层
代码很简单,只有几行,如下,每个图片上都挂上去,就出现上图的效果。
using UnityE
using System.C
using UnityEngine.EventS
public class ChangeHierarchyOnCode : MonoBehaviour, IPointerClickHandler
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
transform.SetAsLastSibling();
// transform.SetAsFirstSibling();
// transform.SetSiblingIndex(2);
然后代码改成这样:
using UnityE
using System.C
using UnityEngine.EventS
public class ChangeHierarchyOnCode : MonoBehaviour, IPointerClickHandler
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
// transform.SetAsLastSibling();
transform.SetAsFirstSibling();
// transform.SetSiblingIndex(2);
运行结果:
运行结果显示,每当点击了一张图片,该图片会被放置到最底层,以至于被其他物体遮挡,
代码中注释掉的transform.SetSiblingIndex(2);已经能够猜出其功能,它会使被点击的物体放置在指定的层级中,
该层级从0开始
越接近0的层级,被更多的物体遮挡,当层级为0时,其效果与transform.SetAsFirstSibling();相同
但是当层级小于0时,其效果与SetAsLastSibling一致
越大的层级,被更少物体遮挡,当层级为大于等于transform.parent.childCount - 1时,其效果与SetAsLastSibling一致
由此我们可以进行这样的猜测(注意:只是猜测):
每个Transform组件,内部保存了一个子物体列表,每当渲染时,从该列表最开始到最末尾依次渲染,于是,如果有遮挡,则后面渲染的物体遮挡住先前渲染的物体。
所以,transform.SetAsLastSibling/transform.SetAsFirstSibling/transform.SetSiblingIndex三个函数灵活使用,就可以在代码中动态的修改图片之间的遮挡关系
本文已收录于以下专栏:
相关文章推荐
Hello,我是 KitStar。
最近在使用UNITY的UGUI的时候碰见一个尴尬的问题。
就是想切换一组图片的前后关系,也就是深度。本来使用着RectTransform.SetSi...
关于TransForm
1.Unity3D中的渲染顺序如下:
不同的Camera的Depth
相同Camera下的不同SortingLayer
相同SortingLayer下的不同Z轴/Order in L...
一、用过NGUI的人们都知道,各种NGUI的sprite之间是可以有dept来进行分层管理,以便处理层级间的关系,而在unity4.6开始的UGUI中,这是通过Canvas来设置深度关系的
我在开发中...
目录1、介绍两大UI插件NGUI和UGUI
2、unity渲染顺序控制方式
3、NGUI的控制
4、UGUI的控制
5、模型深度的控制
6、粒子特效深度控制
7、NGUI与模型和粒子特效穿...
using UnityE
using System.C
using UnityEngine.UI;
public class UIDepth : MonoBeha...
Canvas是用来放置所有UI元素的地方。Canvas是一个含有Canvas组件的GameObject,所有的UI元素必须是这样一个Canvas的子对象。
如果场景中还没有Canvas对象,新创建U...
【狗刨学习网】
随着 Unity 4.6 发布,新 UI 系统终于与大家见面了。
RectTransform
Unity UI 系统使用 RectTransform 实现基本的布局和层次控制...
最近的工作任务是实现模态对话框,模态对话框弹出后要显示在最前面,为了实现这个效果,我从网上找到了解决办法:
通过SetSiblingIndex 和 GetSiblingIndex设置与获取 gameO...
http://blog.csdn.net/kingsea168/article/details/
之前一直用NGUI开发界面,但看到现在的unity的新版本的UGUI也不错,这几天...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在UI上显示3D的特效,要考虑两个问题:
1、特效的位置自适应与UGUI自适应一致,否则在16:9下把特效调好位置后,切成16:10后,位置对应不上
2、特效显示层次最好能夹在UI中间
UGUI毕竟是个新的UI系统,各方面还很不成熟,显示特效的问题着实让我头疼了一番。
1、UI特效叠层显示可以参考雨松MOMO的博客:,但是只能解决叠层的问题,而且对于复杂的界面系统,每一层都加一个UIDepth的组件非常蛋疼。自适应的问题要根据不同分辨率再进行一番艰难的调整,除非你可以写一套类似的Canvas自适应系统。
2、使用UGUI的RawImage,把Camera拍摄特效输出的RenderTexture拖到RawImage上,运行时即可看到效果。这种方法不仅能使用UGUI的自适应,而且层级也可以调整,通常显示UI模型时都是用这种方法,但是对于半透明的粒子、Mesh就不那么好处理了。最后找到一位前辈的文章,终于解决了困扰了我好几天的问题。想看原文点。
1、用一个单独的相机,对着特效拍照,设置输出的Target Texture
2、使用UGUI的RawImage组件,设置Texture为相机输出的Texture
这部分的内容,其实官方已经给出,打开RenderTexture场景就可以看到这个例子,就不详述了
下面用图来说明几个步骤:
先说一下demo的层次结构,“Window”下有两个Image,一个RawImage,RawImage夹在两个Image中间,我们想要的效果就是RawImage在Image1上,在Image2下。
1、相机参数设置
2、特效设置层次为UI3D(自己添加的Layer)
相机拍到特效的效果如下:
3、在UI中加上一个RawImage,设置Texture为上一步相机输出的Texture,加一个Default No-Alpha的材质(Shader在下面贴出,demo资源里也有)
4、运行查看效果
1、RenderTexture的尺寸越大,内存占用越多,尽可能缩减RenderTexture的尺寸吧
2、RenderTexture的尺寸要与RawImage的大小一致,否则出现拉伸变形
3、每个特效对应一个相机,如果特效多的话,还是用代码管理特效相机吧
进一步思考,通常美术把一个特效的prefab发过来,我们只要把这个prefab和UI中的RawImage绑定即可,相机什么的才不想每次都动手加一遍,所以有了下面偷懒的代码
using UnityE
using UnityEngine.UI;
[RequireComponent(typeof(RawImage))]
public class UI3DEffect : MonoBehaviour
[SerializeField]
private GameObject effectP
private GameObject effectGO;
private RenderTexture renderT
private Camera rtC
private RawImage rawI
void Awake()
rawImage = gameObject.GetComponent&RawImage&();
if (rawImage == null)
rawImage = gameObject.AddComponent&RawImage&();
public RectTransform rectTransform
return transform as RectT
void OnEnable()
if (effectPrefab != null)
effectGO = Instantiate(effectPrefab);
GameObject cameraObj = new GameObject("UIEffectCamera");
rtCamera = cameraObj.AddComponent&Camera&();
renderTexture = new RenderTexture((int)rectTransform.sizeDelta.x, (int)rectTransform.sizeDelta.y, 24);
renderTexture.antiAliasing = 4;
rtCamera.clearFlags = CameraClearFlags.SolidC
rtCamera.backgroundColor = new Color();
rtCamera.cullingMask = 1 && 8;
rtCamera.targetTexture = renderT
effectGO.transform.SetParent(cameraObj.transform, false);
rawImage.enabled = true;
rawImage.texture = renderT
rawImage.texture = null;
Debug.LogError("EffectPrefab can't be null");
void OnDisable()
if (effectGO != null)
Destroy(effectGO);
effectGO = null;
if (rtCamera != null)
Destroy(rtCamera.gameObject);
rtCamera = null;
if (renderTexture != null)
Destroy(renderTexture);
renderTexture = null;
rawImage.enabled = false;
当RawImage启用时,立刻创建动态相机、RenderTexture,设置参数。不启用时,自动销毁相机和RenderTexture。当然特效多的话,也可以做个对象池把Camera和RenderTexture缓存起来。
然后用的时候是这样的,只需要一步,把特效prefab拖进来即可
UI-Default-No-Alpha.shader
Shader "UI/Default No-Alpha"
Properties
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Color("Tint", Color) = (1,1,1,1)
_StencilComp("Stencil Comparison", Float) = 8
_Stencil("Stencil ID", Float) = 0
_StencilOp("Stencil Operation", Float) = 0
_StencilWriteMask("Stencil Write Mask", Float) = 255
_StencilReadMask("Stencil Read Mask", Float) = 255
_ColorMask("Color Mask", Float) = 15
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
Ref[_Stencil]
Comp[_StencilComp]
Pass[_StencilOp]
ReadMask[_StencilReadMask]
WriteMask[_StencilWriteMask]
Lighting Off
ZWrite Off
ZTest[unity_GUIZTestMode]
Fog{ Mode Off }
Blend One Zero
ColorMask[_ColorMask]
Blend One OneMinusSrcAlpha // 源rgba*1 + 背景rgba*(1-源A值)
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
float4 vertex
: POSITION
float4 color
float2 texcoord : TEXCOORD0
struct v2f
float4 vertex
: SV_POSITION
fixed4 color : COLOR
half2 texcoord
: TEXCOORD0
fixed4 _Color
v2f vert(appdata_t IN)
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex)
OUT.texcoord = IN.texcoord
#ifdef UNITY_HALF_TEXEL_OFFSET
OUT.vertex.xy -= (_ScreenParams.zw - 1.0)
OUT.color = IN.color * _Color
return OUT
sampler2D _MainTex
fixed4 frag(v2f IN) : SV_Target
half4 color = tex2D(_MainTex, IN.texcoord) * IN.color
//clip (color.a - 0.01)
return color
本文已收录于以下专栏:
相关文章推荐
UGUI-UI添加特效开发项目的时候遇到一个需求,UI上要加特效,UI使用的是UGUI,经过多次试验终于找到一个解决办法。第一步:
创建一个Canvas,在Canvas下创建一个Panel,在Pan...
我使用UGUI有一段时间了,这两天在看李总的Shader教程,自己动手把流光效果完成之后突然想到能不能在UGUI中使用Shader来做UI特效,然后自己就动手尝试着做了一下,完成后运行图如下:
在Uniyt3d开发中,在UI上增加粒子特效是个很出彩的做法。但往往会遇到粒子特效与UI层次错乱的问题。下面分享一个自己的写得小的代码,轻松解决层次问题。
//目标控件
public UIWidget...
一、用过NGUI的人们都知道,各种NGUI的sprite之间是可以有dept来进行分层管理,以便处理层级间的关系,而在unity4.6开始的UGUI中,这是通过Canvas来设置深度关系的
我在开发中...
目录1、介绍两大UI插件NGUI和UGUI
2、unity渲染顺序控制方式
3、NGUI的控制
4、UGUI的控制
5、模型深度的控制
6、粒子特效深度控制
7、NGUI与模型和粒子特效穿...
我们在mmo中通常会有在GUI上面显示一个3D模型的需求,比如查看人物装备的界面。我网上搜索了下,搜到的结果都是直接绑定一个模型到UI的指定位置,最多添加一个摄像机以便控制2d渲染和3d模型渲染的先后...
有时候在 游戏中,我们会需要在UI上面显示3d模型(例如角色选择、装备选择、装备预览等等),这时候我们就要用到RenderTexture和UI里面的RawImage。具体做法就是新建一个RenderT...
unity3d ugui中如何获取ui控件位置?或者说如何将ugui中ui控件(组件)的坐标转化为屏幕坐标或canvas坐标(大坑)?
网上有一些转化坐标的方法,但我试了后发现都有问题,...
UGUI在Screen Space - Overlay渲染模式下,由于不依赖摄像机渲染,使得其无法通过修改Z轴的方式修改物体间的层级关系,以下是解决方案:
我创建了一个空的工程,然后创建了一个I...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)现在手头的项目是用NGUI实现的2D游戏,其中穿插各种模型和特效...总之,各种蛋疼。问了好多人,也没解决面片特效层级调整的问题,颇为感概:不是unity不人性,只是项目非主流...
但是当问题解决后,才发现,unity也挺人性的,只是自己知道的还太少。
整理一下unity和NGUI的各种层级关系。在NGUI下,有这么几层(按优先级从高到低排列):
1,摄像机的深度 Camera.Depth
1.5,SortLayer
2,SortOrder,这个属性可以在NGUIPanel和粒子的Render里调整,默认都是0
3,RenderQueue属性,这个在Inspector面板中只能在UIPanel中显示调整(从3000开始,设置以后“4”和“5”的Depth就会失效,即便这个属性值一致),并且每个Material也可以通过代码设置这个值
4,UIPanel的Depth
5,UIWidget的Depth
6,空间坐标,在以上属性一致的情况下,根据与摄像机的位置渲染
补充:以上关系都是在shader的ZWrite属性设置为OFF的前提下,如果是ON,就呵呵了
之前一直比较蛋疼的是,不知道怎么设置用面片模型制作的特效的层级。
void ChangeQueue(int layer)
if (layer &= 3300) layer = 3300;
gameObject.GetComponent&Renderer&().sharedMaterial.renderQueue =
用上面这个去设置,一切OK!
这种方式同样对于粒子有效。通过这种方式,就不用调整SortOrder
欢迎转载。转载请注明:
Hello光头原创
如有建议或意见,欢迎留言。
也欢迎大家加我qq,一起学习进步:
本文已收录于以下专栏:
相关文章推荐
先列出转载链接:
最开始使用 NGUI的时候,一直在接收NGUI的各种设定。后面项目用UGUI,相比NGUI更方便些,但是可控性却少了,现在又开始新项目,重归NGUI。但是又开始纠结Panel的深度管理。项目中设计的是...
出处:/bbs/article-574-1.html
NGUI的层级关系有点复杂,这里把从网上搜来的关于NGUI层级深度的信息合并到一起,...
1、同一个panel下,同一个atlas的不同sprite的显示只受depth的控制,这是最经常用的方式。此时不论精灵的z轴如何变化,depth高的一定在前面。(相同atlas其实是共用同一个Z轴深度...
public class ControlParticle : MonoBehaviour {
public int renderQueue = 30000;
【Unity3D】【NGUI】3.0+版本,粒子在UI后面显示
分类: Unity3D NGUI
12:34 1606人阅读 评论(0) 收藏 举报
unity3d...
1、要使粒子渲染在两张图片中间,必须将两个图片的渲染批分开,就在同一个深度段内,假如没有其它其它图集的批渲染添加进来,图片的渲染顺序是depth顺序,但是此时粒子和图集是一个批次渲染,粒子始终在这个图...
在使用NGUI和unity2d的时候,发现一个问题,
目录1、介绍两大UI插件NGUI和UGUI
2、unity渲染顺序控制方式
3、NGUI的控制
4、UGUI的控制
5、模型深度的控制
6、粒子特效深度控制
7、NGUI与模型和粒子特效穿...
接着上一篇文章的问题,为ngui pan
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 1336|回复: 5
Unity4.6 UI如何设置UI层级,我记得NGUI上直接改变Depth
本帖为抢楼帖,欢迎抢楼!&
4370/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 370, 距离下一级还需 130 积分
四处流浪, 积分 370, 距离下一级还需 130 积分
在线时间102 小时
Unity4.6 UI如何设置UI层级,我记得NGUI上直接改变Depth
本帖被以下淘专辑推荐:
& |主题: 22, 订阅: 26
每日推荐:
12排名<font color="#FF昨日变化主题帖子积分
蛮牛币7357
在线时间1255 小时
你说的是ugui吗?&&代码先画的优先级低,意思就是 同样画了两个圆形,后面那句代码画出来的会覆盖你之前代码画出来的。
每日推荐:
4370/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 370, 距离下一级还需 130 积分
四处流浪, 积分 370, 距离下一级还需 130 积分
在线时间102 小时
你说的是ugui吗?&&代码先画的优先级低,意思就是 同样画了两个圆形,后面那句代码画出来的会覆盖你之前代 ...
哦,我也发现了,谢谢拉,在问个问题,就是ugui为啥在编辑器模式下不能自适应屏幕,例如我设一个背景,用的是image,但我运行窗口拉到900*768时,不能显示全,不像NGUI会自动调整
每日推荐:
12排名<font color="#FF昨日变化主题帖子积分
蛮牛币7357
在线时间1255 小时
哦,我也发现了,谢谢拉,在问个问题,就是ugui为啥在编辑器模式下不能自适应屏幕,例如我设一个背景, ...
设置图片宽高的时候不要直接写200 200& &你写成screen.width/2,screen.height/2,这种可以适配
每日推荐:
127/50排名<font color="#FF昨日变化47主题帖子积分
注册看看, 积分 27, 距离下一级还需 23 积分
注册看看, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
学习了。。。。。。。。。
每日推荐:
3281/300主题帖子积分
偶尔光临, 积分 281, 距离下一级还需 19 积分
偶尔光临, 积分 281, 距离下一级还需 19 积分
在线时间136 小时
每日推荐:
认证开发者
经过游戏蛮牛认证的独立开发者}

我要回帖

更多关于 unity 动态设置layer 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信