当前位置: 首页 > article >正文

【unity小技巧】unity排序问题的探究

文章目录

  • 前言
  • 一、排序图层
  • 二、sorting Group的使用
  • 三、树木排序设计
    • 方法一 代码控制
    • 方法二 拆分图片
    • 方法三 透视排序
      • 1. 普通物品排序
      • 2. TileMap瓦片排序设计
  • 完结

前言

unity的排序问题其实之前分享的项目多多少少都有提到一点,但是没有单独拿出来说,所以这次特地做一次整理

本文主要解决几个问题:

  • 排序图层的作用?
  • sorting Group排序组的使用?
  • 树木排序问题,我们希望实现人物走到树前,人物遮挡树木,当人物走到树后,树又遮挡玩家

一、排序图层

排序图层应该是我们用的最多的,也是最简单的了
修改对应的排序图层或者图层顺序即可,图层顺序越大越靠前
在这里插入图片描述

二、sorting Group的使用

排序组通常用于解决一个物体由多个部分组合而成,比如多部位组成的角色,你可以简单的理解sorting Group就是把一个物品看作一个整体来排序,无论如何修改他的内部排序,都不会影响整体的sorting Group排序

比如在以下示例中,按照您希望角色的不同部分的出现顺序对这些部分进行排序。
在这里插入图片描述
配置排序组和排序图层之后,可以将角色另存为预制件,并根据需要进行多次克隆。

但是,预制件精灵全部具有相同的 Sorting Layer 和 Order in Layer 值,并且与其他预制件一起渲染到相同图层,这可能导致一个预制件角色的不同部分错误地相交和分层。
在这里插入图片描述
为了确保预制件的渲染顺序一致以便正确显示,请将 Sorting Group 组件添加到每个预制件的根游戏对象。并配置整体的Order in Layer排序
在这里插入图片描述

三、树木排序设计

我们希望实现人物走到树前,人物遮挡树木,当人物走到树后,树又遮挡玩家

如果我们直接修改图层排序方式肯定是不行的,玩家要么直接被遮挡,要么直接遮挡树木

方法一 代码控制

当然你可以通过代码的方式,动态的修改人物图层排序值

如果我们正常直接添加一些资源物体,会发现排序变得很乱
在这里插入图片描述
我们可以通过脚本来控制资源的排序,大致逻辑就是按物体的y轴来控制排序

using UnityEngine;

public class SpritePositionSortingOrder : MonoBehaviour
{
    [SerializeField] private bool runOnce; // 是否只运行一次
    [SerializeField] private float positionOffsetY; // Y轴位置偏移量

    private SpriteRenderer spriteRenderer;

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>(); // 获取当前对象的SpriteRenderer组件
    }

    private void LateUpdate()
    {
        float precisionMultiplier = 5f; // 精度乘数,可以根据需要调整

        // 根据当前对象的位置和Y轴偏移量计算出sortingOrder值,并将其赋给SpriteRenderer组件的sortingOrder属性
        spriteRenderer.sortingOrder = (int)(-(transform.position.y + positionOffsetY) * precisionMultiplier);

        if (runOnce)
        {
            Destroy(this); // 如果设置了只运行一次,就在完成一次排序后销毁脚本组件
        }
    }
}

效果
在这里插入图片描述
显然这太麻烦了

方法二 拆分图片

最简单的方法就是将树叶和树根分开,树叶图层排序比人物高,树根图层排序比人物低,当然这样绘制会比较麻烦一些
在这里插入图片描述

效果
在这里插入图片描述

方法三 透视排序

使用透视排序。也就是“伪造”透视图。根据直觉,玩家希望角色在立方体前面时首先绘制角色,而角色在立方体后面时最后绘制角色。

如果用更技术性的语言来说,你需要做的是指示 Unity 根据游戏对象的 y 坐标来绘制游戏对象。屏幕上位置较低的游戏对象(y 坐标较小)应在屏幕上位置较高的游戏对象(y 坐标较大)之后绘制。这样将使位置较低的对象显示在上层。

要指示 Unity 根据游戏对象的 y 坐标来绘制游戏对象,请执行以下操作

选择 Edit > Project Settings。

在左侧类别菜单中,单击 Graphics

在 Camera Settings 中,找到 Transparency Sort Mode (透明度排序模式)字段。此字段决定了精灵的绘制顺序。使用下拉菜单将此设置从 Default 更改为 Custom Axis(自定义轴),修改Transparency Sort Axis(透明排序轴)为(0,1,0),告诉Unity y轴绘制精灵

在这里插入图片描述

1. 普通物品排序

找到树木的 Sprite Sort Point (Sprite 排序点)字段。目前,此字段设置为 Center,这意味着会使用精灵的中心点来决定这个游戏对象应该在另一个游戏对象的前面还是后面。将 Sprite Sort Point (Sprite 排序点)更改为 Pivot(轴心)
注意:记得树木图层排序顺序要和主角人物设置为一样

修改树木图片的轴心位置到树木根部
在这里插入图片描述

这样就实现了人物在树木轴心下面,先绘制树木,人物在轴心以上,先绘制角色
在这里插入图片描述

2. TileMap瓦片排序设计

在最右边的Tilemap Renderer:将Mode设置为Individual
在这里插入图片描述
把对应图片的轴心放在底部
在这里插入图片描述
为了使其更加准确,我们可以更改角色的轴心位置也在底部
在这里插入图片描述
并修改角色的精灵排序点为轴心
在这里插入图片描述
效果,可以看到,角色在栅栏上角色在后,角色在栅栏前角色在前
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。点赞越多,更新越快哦!当然,如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.kler.cn/a/108196.html

相关文章:

  • 设计模式练习(一) 单例模式
  • 【STM32F1】——无线收发模块RF200与串口通信
  • 【数据结构与算法】第11课—数据结构之选择排序和交换排序
  • Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件
  • ML 系列: 第 24 节 — 离散概率分布(泊松分布)
  • 学习方法——看差的书籍
  • 如何使用 Rask AI 进行视频本地化
  • 腾讯云和阿里云双11优惠大战,服务器价格相差1块钱?
  • laravel+vue2 element 一套项目级医院手术麻醉信息系统源码
  • python实现ModBusTCP协议的server
  • 【vtk学习笔记1】编译安装vtk9.2.6,运行官方例子
  • 如何在linux服务器上安装Anaconda与pytorch,以及pytorch卸载
  • TextureView和SurfaceView
  • 【Python 算法】信号处理通过陷波滤波器准确去除工频干扰
  • localhost知识
  • iMazing2024年最新许可证-iMazing许可证激活补丁
  • UE5实现相机水平矫正
  • 基于数字电路交通灯信号灯控制系统设计-单片机设计
  • 什么是三元表达式?
  • 【机器学习】项目数据处理部分
  • 利用Linux socat快速搭建TCP服务器
  • 基于springboot环保话题管理系统-计算机毕设 附源码 28550
  • 【黑产攻防道03】利用JS参数更新检测黑产的协议破解
  • Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】
  • VCS 和 SCM
  • 系统架构设计师-第13章-层次式架构设计理论与实践-软考学习笔记