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. jdk配置完成tomcat无法启动问题解决

    今天在进行struts2练习之前,准备为电脑配置tomcat容器,发现jdk的java指令可以正确运行,而tomcat启动时控制台弹出后立即消失.查资料显示jdk为正确配置,但是自己的java指令都能 ...

  2. 后端跨域问题究极解决 nginx+springboot 解决OPTIONS通过却报CORS的问题

    location /joinus { # 允许跨域请求的"域",有些请求不允许* add_header 'Access-Control-Allow-Origin' $http_or ...

  3. 初识$router和$route

    初识\(router和\)route 一.前言 ​ vue框架中单页面富应用可以说是其最大的优点功能之一了,应用起来简单直观,说起单页面富应用那就必须得联想到\(router**,但是在项目开发过程中 ...

  4. 基于MRS-ClickHouse构建用户画像系统方案介绍

    业务场景 用户画像是对用户信息的标签化.用户画像系统通过对收集的各维度数据,进行深度的分析和挖掘,给不同的用户打上不同的标签,从而刻画出客户的全貌.通过用户画像系统,可以对各个用户进行精准定位,从而将 ...

  5. width:auto 和 width:100%有什么区别

    width:auto 和 width:100%有什么区别 宽度计算不同 <div class="parent"> <span class="child& ...

  6. Redis数据结构详解(1)-redis中的字符串(SDS)

    前提知识 我们先从百科上摘下Redis的解释: Redis是一个使用ANSI C编写的开源.支持网络.基于内存.分布式.可选持久性的键值对存储数据库. (不用过多在意ANSI,它只是一个标准,你可以理 ...

  7. 什么是springboot?为什么要用springboot?

    一.什么是springboot? Springboot是spring发展到一定程度的产物,但并不是spring的替代品,springboot是为了让程序员更好的使用spring.Spring随着发展逐 ...

  8. linux上使用nginx、uwsgi部署django项目

    参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...

  9. 使用Ansible部署openstack平台

    使用Ansible部署openstack平台 本周没啥博客水了,就放个云计算的作业上来吧(偷个懒) 案例描述 1.了解高可用OpenStack平台架构 2.了解Ansible部署工具的使用 3.使用A ...

  10. 7_根轨迹_Part1_“根”的作用

    这里的渐近线,应该是e^[**wn]/wd,忘记除wd了