Unity中的2D层级显示问题
1.层级显示
使用素材为免费或自制
本文章只用于学习和记录
在Unity2D游戏中可能出现以下情况



贴图的前后关系不正确
可以通过控制图片的层级来解决
本示例中杰西卡和树木都是搭载了图片的空物体,背景为Tilemap
新建脚本PositionSortRenderer
public class PositionSortRenderer : MonoBehaviour
{
[SerializeField] //序列化,私有变量也能显示在Inspector面板中
private int sortingOrderBase = 5000; //大参数方便后续计算
private Renderer myRenderer; //声明一个Renderer
private void Awake()
{
myRenderer = gameObject.GetComponent<Renderer>();
}
private void LateUpdate() //在角色和场景内所有物体(包括摄像机)完成移动后进行
{
myRenderer.sortingOrder = (int)(sortingOrderBase - transform.position.y);//根据y左边方向计算
//这里个人感觉sortingOrderBase用0也行,但正数方便计算且节省性能
//个人感觉可以将减法优化为加法
}
}
注意这里是在LateUpdate() 中进行层级运算
Unity应当在层级内的所有物体运动完成和所有物理计算如碰撞这些完成之后再进行与图片等渲染有关的处理,否则图片在运动和碰撞检测时会不断抽搐,这里不深入细讲,LateUpdate()会在FixedUpdate()和Update()之后运行。
注意这里需要将代码搭载到需要排序且有Sprite Renderer的图片上,而非空物体
运行后发现有效果

但仍有问题

这是参与计算的是图片的中心点(锚点)位置的原因


那么解决方法存在两种
2.通过代码解决
因为图片默认为中心点,那么只需要在计算时减去中心点到图片底部这一段距离即可
优化PositionSortRenderer
//public class PositionSortRenderer : MonoBehaviour
//{
//[SerializeField]
//private int sortingOrderBase = 5000;
[SerializeField]
private int offset = 0;
//private Renderer myRenderer;
//private void Awake()
//{
//myRenderer = gameObject.GetComponent<Renderer>();
//}
//private void LateUpdate() //在角色和场景内所有物体(包括摄像机)完成移动后进行
//{
myRenderer.sortingOrder = (int)(sortingOrderBase - transform.position.y - offset);
//}
//}
这里Offset可以每个图片微调,直接获取图片高度一半的方法还在尝试
3.通过修改图片的锚点来修改
也可以直接修改图片的中心点
单体图片点击即可修改

分割的图片需要打开Sprite Editor选中修改,但单体图片也可进行相同操作
中间的蓝色圆圈即为图片的中心,可以直接拖拽进行修改

修改后如下

4.继续优化
其实那些位置不变的物体只需要计算一次层级,只有类似玩家这类不断移动的物体才需要持续计算层级,静止物体只计算一侧层级能节省许多性能开销
继续优化PositionSortRenderer
//public class PositionSortRenderer : MonoBehaviour
//{
......
[SerializeField]
private bool runOnlyOnce = false;
//private Renderer myRenderer;
......
//private void LateUpdate() //在角色和场景内所有物体(包括摄像机)完成移动后进行
//{
//myRenderer.sortingOrder = (int)(sortingOrderBase - transform.position.y - offset);
if (runOnlyOnce)
{
Destroy(this); //这里摧毁了脚本
}
//}
//}
这样勾选了Run Only Once的图片进行一次层级运算后便会销毁
这里层级信息被直接赋值给了Unity

因为大部分静态对象没有必要每帧都进行层级运算,避免后续计算导致性能开销
角色这类需要运动的对象不要勾选,需要一直对其进行层级运算
5.再次优化
角色的层级运算也不必每帧进行,因为大部分玩家其实是观察不出来的,如果我们通过计时器来定时计算玩家这类会移动的图片还能省下不少性能。
继续优化PositionSortRenderer
//public class PositionSortRenderer : MonoBehaviour
//{
......
private float timer;
private float timerMax = 0.1f;
//private Renderer myRenderer;
......
//private void LateUpdate() //在角色和场景内所有物体(包括摄像机)完成移动后进行
//{
timer -= Time.deltaTime;
if (timer <= 0f)
{
timer = timerMax;
//myRenderer.sortingOrder = (int)(sortingOrderBase - transform.position.y - offset);
//if (runOnlyOnce)
//{
//Destroy(this);
//}
}
//}
//}
这里我设置为0.1秒计算一次,也可自行修改
这样就能得到正确的显示结果


Unity中的2D层级显示问题的更多相关文章
- 关于Unity中的删除、显示和隐藏节点
一.删除节点和组件 1.删除一个节点,以及节点上面所有的组件全部删除了//删除一个节点的时候,节点上面所有的组件也会被删除:MonoBehaviour.Destroy(this.gameObject) ...
- Unity中2D和UGUI图集的理解与使用
图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...
- Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug
问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...
- 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术
[Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- Unity中Mesh分解与边缘高亮加上深度检测
一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...
- Unity中简单使用Opengl
简介 由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了).所以琢磨咯下如 ...
- 在Unity中高效工作(上)
原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...
- Unity 4.3 2D 教程:新手上路
这篇文章译自 Christopher LaPollo 先生的 Unity 4.3 2D 教程的第一部分 Unity 4.3 2D Tutorial: Getting Started 感谢这套优秀教程的 ...
随机推荐
- OpenSSL CVE-2022-0778漏洞问题复现与非法证书构造
本文介绍CVE-2022 0778漏洞及其复现方法,并精心构造了具有一个非法椭圆曲线参数的证书可以触发该漏洞. 本博客已迁移至CatBro's Blog,那是我自己搭建的个人博客,欢迎关注.本文链接 ...
- Web调试工具之调试方法
转载于: http://toutiao.com/news/6242781162012410370/ 一.Firefox 插件之 Firebug, 火狐调试利器[初学必备] 为什么要第一个提到火狐呢?因 ...
- MongoDB 事务机制
MongoDB 从4.0 版本开始 副本集支持多文档事务,4.2 版本开始分片集群也支持多文档事务.单个集合的单个文档事务 在 1.x 就支持. 以下是跟 mongo 事务相关的一些概念: 1. Wr ...
- MySQL二进制binlog日志说明以及利用binlog日志恢复数据
MySQL的binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全量备份+binlog日志恢复增量数据部分). 一.关于 ...
- 用腾讯云Gogs搭建私有git服务器
前言 经常有需要写不能公开代码的项目,所以只好自己搭建一个私人的git服务器 Gogs的好处在于比Gitlib轻量化了好多,而且是国人写的,官方主页也是中文的 Gogs首页 腾讯云服务器配置: Ubu ...
- 华为云图引擎服务 GES 实战——创图
本实验主要是熟悉 GES 的创图操作,GES 创图的大致流程如下所示. 环境准备 上传数据 导入元数据 创建图 环境准备 由于 GES 的原始数据是存在 OBS 上的,如果 OBS 上没有桶,需要按照 ...
- java反射和动态代理实现与原理详细分析
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- 数据结构-二叉树、B树、B+树、B*树(整理版)
1. 二叉树 二叉树的特点: ① 所有非叶子节点至多拥有两个儿子(Left和Right): ② 所有节点存储一个关键字: ③ 非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: ...
- bash shell 中的 hash 命令有什么作用?
linux 命令'hash'管理着一个内置的哈希表,记录了已执行过的命令的完整路径,用该命令可以打印出你所使用过的命令以及执行的次数. [root@localhost ~]# hashhits com ...
- 什么情况下一个 broker 会从 isr中踢出去?
leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护 ,如果一个foll ...