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层级显示问题的更多相关文章

  1. 关于Unity中的删除、显示和隐藏节点

    一.删除节点和组件 1.删除一个节点,以及节点上面所有的组件全部删除了//删除一个节点的时候,节点上面所有的组件也会被删除:MonoBehaviour.Destroy(this.gameObject) ...

  2. Unity中2D和UGUI图集的理解与使用

    图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...

  3. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  4. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  5. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  6. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  7. Unity中简单使用Opengl

    简介 由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了).所以琢磨咯下如 ...

  8. 在Unity中高效工作(上)

    原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...

  9. Unity 4.3 2D 教程:新手上路

    这篇文章译自 Christopher LaPollo 先生的 Unity 4.3 2D 教程的第一部分 Unity 4.3 2D Tutorial: Getting Started 感谢这套优秀教程的 ...

随机推荐

  1. 在微信小程序中使用 echarts 图片-例 折线图

    首先进入echarts官方[https://echarts.apache.org/handbook/zh/get-started/].这边只需要在小程序中简单应用一下echarts折线图 所以不需要把 ...

  2. JavaWeb——Tomcat使用

    官方下载地址:https://tomcat.apache.org/download-90.cgi 选择安装包: 64-bit Windows zip (pgp, sha512) 注:tar.gz后缀的 ...

  3. web服务器-Nginx下载限速

    web服务器-Nginx下载限速 一. 限速介绍 在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配. 限流(rate limiting)是N ...

  4. Superset安装部署操作

    目录 1.安装Miniconda 1.下载Miniconda 2.安装 3.开启一个新的shell窗口 4.设置新窗口不自动开启conda 2.创建Python3.7环境 1.配置国内镜像 2.常用命 ...

  5. 如何绑定msix中断 cpu亲和性

    echo X > /proc/irq/中断号/smp_affinity /proc/irq目录下面会为每个注册的irq创建一个以irq编号为名字的子目录,每个子目录下分别有以下条目:1.smp_ ...

  6. Axure7.0 以及 中文汉化语言包下载 axure汉化包

    支持 Axure RP Pro 正式版 当前最新版本 7.0.0.3184 不兼容6.5及以下版本! Axure7.0 下载地址:http://pan.baidu.com/s/1dEuR8YX Axu ...

  7. loj2985「WC2019」I 君的商店(二分,思维)

    loj2985「WC2019」I 君的商店(二分,思维) loj Luogu 题解时间 真的有点猛的思维题. 首先有一个十分简单的思路: 花费 $ 2N $ 确定一个为 $ 1 $ 的数. 之后每次随 ...

  8. git tag、gitignore和git撤销提交

    前言 最近在git的使用过程中遇到了一些新的问题,所以写下来方便自己回忆. git tag 打标签 git tag -a v1.00 -m "注释" git tag 打标签命令 - ...

  9. 如何快速开发基于Winform的应用系统

    在我们实际业务开发中,从头开发一个应用系统,不管是基于BS的前端项目,还是基于Winform的CS应用系统,都是由容易到复杂,逐步演化的一个开发过程,如果我们基于一定基础上,并配合一些配套的开发工具, ...

  10. Java 建造者Builder

    import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.u ...