【小松教你手游开发】【unity实用技能】u3d 层次问题总结
首先的首先,NGUI区分前后层次关系是用Depth值。已经跟z轴值无关
首先因为我自己用的是NGUI,所以我的u3d层次问题也就是NGUI的层次问题
先确定UI渲染顺序,Camera>UIPanel>Depth(UIWidget)
这里的意思是,首先确定前后关系的是不同大块之间的Camera的Depth值,根据Depth大小排列,这个决定了每个大块之前的前后关系。
接着根据UIPanel的Depth前后排序,这个是用于每个大块内可能有多个UIPanel分割成多个小块,每个小块间的前后关系。
最后是UIWidget(比如UILabel,UISprite,这些都继承于UIWidget)的Depth值,在同一个UIPanel下,决定前后关系。
这里总结来说有两个方面的问题:
1.整体的层次
2.UIPanel 间的层次
一、整体的层次:
整体的层次指的是一个游戏UI一般会分为几个模块,如Effect(特效)、Background、Main、Popup等。在这些大块之间要区分前后关系时(比如Background最后,Main中间,Popup最前)就要区分到前后层次关系。这些层次一般会有同一个父节点UI_Root(不在同一个父节点也可以)
基本上整体的层次是根据Layer来分前后关系,Layer本身是不带Depth,所以在这些大块下,一般在他们的gameobj本身或者在他们下面会有个子节点Camera。通过Camera的CullingMask来确定这个Camera具体渲染哪个Layer下的东西。而通过这个Camera的Depth值来确定整体层次间的前后关系。
注意:在大块的Camera之间如果Depth值相同时,z轴值会影响前后关系。但是这个应该是要避免的。不应该有相同Depth值得不同Camera
二、UIPanel 间的层次
网上有很多分析在不同Atlas(图集)不同depth不同z轴值时的前后关系。但是如果知道为什么就能处理所有情况。这里解释一下。
其实前后层次关系是怎么形成?是因为渲染顺序的前后关系,越晚渲染的越在前面,所有通过把一个场景分割成几块,排一下渲染顺序,按顺序渲染就能使界面正常显示而不导致遮挡错乱,这样就能控制好UI的层次关系。
而UIPanel的作用就是用来确定把什么东西放在一起渲染和UIPanel的Depth就是确定每一块的渲染顺序,最后生成一个Drawcall。
所以首先要解决的是把什么东西渲染到一块,也就是一个Drawcall里面要渲染什么,一个UIPanel里要包括什么。
举个例子:
像这个界面可以分成几块:
每一块都可以分成一个UIPanel,每个UIPanel控制自己的Depth和透明度。可以处理好之间的遮挡问题。
以上是NGUI的基本渲染逻辑, 但是NGUI会自动把同一界面的同一张图集的东西一起渲染,也就是不管你这里几个UIPanel,UIPanel的Depth是3,4,5,还是30,40,50,只要是同一张图集的就会一起渲染。再通过加成计算算出前后关系。但是这里会有一个问题,就是假如你有两张图集,两张图集的图片的Depth相互交叉,这样会导致NGUI无法识别同一图集,导致渲染出错,导致更多的Drawcall。
例:如果在同一个atlas的两个sprite的depth不同比如1,3.在同一panel中有另一个atlas(比如字体)的depth在他们中间,比如2.就是
atlas1_sprite:depth 1
font_label:depth 2
atlas1_sprite:depth 3
这样不是两个drawcalls是三个
这个就是导致为什么在在不同情况下Depth会控制不了渲染顺序的原因。
所以这里一般项目就会有一个比较取巧的方法避免。
1.UI只用一张图集,2.字体的Depth放到300以上。
然后在完成一个UIPanel后需要检查一下,Drawcall是否正常。这个可以在NGUI的工具里打开Drawcall Tool来查看。(目标是把相同图集的Drawcall合并成一个)
之后的UIPanel的问题都会通过UIPanel和UIWidget的Depth来解决
转载于:https://blog.51cto.com/13638120/2084899
【小松教你手游开发】【unity实用技能】u3d 层次问题总结相关推荐
- mtk 帧同步_【小松教你手游开发】【面试必读(编程基础)】网络游戏同步方式(帧同步和状态同步)...
在做网络游戏的时候首先要做的是选择一种同步方式来使用,网上的文章都是说帧同步与状态同步的选择,但是又经常讲的模糊不清,我大概整理了一下,并且有一种我们现在项目用的网络同步方式 状态同步 状态同步就有好 ...
- 【小松教你手游开发】【unity实用技能】InvalidOperationException: ou
InvalidOperationException: out of sync 在unity开发中出现这个bug. 在网上查了下是在迭代器中直接修改引起的.c#是不允许你在迭代器中直接修改. 改了一下确 ...
- 【小松教你手游开发】【unity实用技能】网游同步技术
http://www.skywind.me/blog/archives/1343 转自http://www.skywind.me/blog/archives/1343 实时动作游戏在近年来得到迅猛的发 ...
- 【小松教你手游开发】【unity实用技能】unity游戏移植到WindowsPhone8平台上的一些...
最近在移植u3d的游戏到WindowsPhone8上,WindowsPhone有多蛋疼就不说,移植的过程中还各种问题,稍稍总结一下 1.WindowsPhone账号在电脑上注册不要在手机上.手机上我就 ...
- 【小松教你手游开发】【unity实用技能】计算目标物体是否在自己的扇形视野范围...
在做游戏开发中经常会需要到计算扇形的视野或者是受击范围的时候. 其实这个分为两部分, 第一部分是在扇形距离范围内(也就是不考虑角度,其实是圆形范围内) 第二部分是扇形角度范围内 第一部分很简单,Vec ...
- 【小松教你手游开发】【unity实用技能】给每个GameObject的打开关闭加上一个渐变...
在游戏开发中,经常会因为直接将GameObject,setActive的方式打开关闭,这种方式效果太过生硬而给它加上一个Tween 可能是AlphaTween或者ScaleTween. 再加上一个Pl ...
- 【小松教你手游开发】【unity实用技能】Unity图片变灰的方式
http://www.tuicool.com/articles/Vruuqme NGUI中的Button几乎是最常用到的控件之一,并且可以组合各种组件(比如UIButtonColor,UIButton ...
- 【小松教你手游开发】【unity系统模块开发】Unity5.5.2UI打包AssetBundle
之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅. 刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程 这里就把这次的经验写一下 这里还是稍微解释一 ...
- 【小松教你手游开发】【面试必读(编程基础)】堆和栈的区别(转过无数次的文章)...
一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈 ...
最新文章
- 极大似然估计_极大似然估计、极大后验估计和贝叶斯估计
- Windows Server云服务器配置深度学习环境WS
- PC机I/O端口分配列表
- 计算机一级挂科率,[转]计算机一级难吗?看了它想挂科,难难难难把此(精)
- Linux教程:内核怎样管理你的内存
- tomcat运行问题解决方法
- JS实现大整数乘法(性能优化、正负整数)
- LeetCode 题 - 88. 合并两个有序数组
- 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
- Java中将ResultSet结果集转换为List
- count(1)与count(id)与count(*)效率,以及覆盖索引,索引下推
- Facebook内布拉斯加州数据中心将扩建100万平方英尺
- TML5期末大作业:美丽家乡网站设计——美丽家乡-含论文(4页) HTML+CSS+JavaScript web前端设计与开发期末作品/期末大作业
- swift PickerView
- springboot 神通数据库
- 极路由 斐讯K2 Newifi 华硕固件 实现ipv6穿透方法
- java 事务嵌套_Java事务以及嵌套事务
- FREEIPA:ipa-server的部署使用
- 夏令营面试常见英文问题回答_回答有关5合1促销的3个常见问题
- re.sub 使用方法
热门文章
- ubuntn卸载显卡驱动后无法进入图形界面
- 博客园右下角添加看板娘
- APP启动视屏 APP第一次启动播放视屏欢迎
- Elasticsearch的原理详解和使用
- [生存志] 第61节 孔子五期弟子
- squid二级代理配置
- macOS BigSur正式版来了!这些新变化和新功能值得一试
- 易语言局域网 php 控制,易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码...
- Renamer for Mac 6.0.6批量重命名文件。
- 石家庄铁道大学数据结构实验4 图(完整代码)