Unity——渲染层级关系


在这里插入图片描述
渲染主要是针对Game窗口下显示的内容,类似于画板,先画一层后画一层,后画的可以把之前的一层给覆盖掉。于是unity有了渲染关系层级关系。

Camera层级

因为Game窗口是摄像机Camera的映射画面,所以Camera是高层的渲染结果。
Camera的Depth

比如:我只添加了两个摄像机,一个是场景自带的Main Camera和我又添加的Camera,我先把Camera禁用
在这里插入图片描述
这是Main Camera映射出来的Game场景,能够把我设置的场景完美的显示出来,此时的Main Camera的Depth是-1。
在这里插入图片描述
把添加的Camera启用后,Game窗口中没有任何物体,而camera的Depth层数是0,比Main Camera高,所以把原来的Main Camera的画面给覆盖掉了,导致没有画面。

在同一Camera下,Sorting Layer

前面的Camera适用于3D,2D场景,前面用的是3D项目做得实验,2D也一样,后面的几个适用于2D场景。因为这是关于图片的渲染,在3D中也有关于图片的运用,但主要学习2D中的渲染。(自认为的,可根据自己实际情况了解
在这里插入图片描述
这是新建的2D场景,所有物体都在Main Camera下面(同一摄像机的情况)
此时所有的物体在Sorting Layer相同的情况下(全部都是Default),渲染层级关系是根据你的Hierarchy面板里面物体的顺序来比较的,比如:house是最后添加的,所以它的渲染层级最高,当它在其他物体 之前,都会把它覆盖掉,只显示house自己
在这里插入图片描述
这里就把后面的crate给覆盖掉了
渲染层级改变就要改变两者的Sorting Layer了
在这里插入图片描述
house的没有发生改变,改变了crate的Sorting Layer,这个Sorting Layer可以自己进行添加层级命名
在这里插入图片描述
此时的渲染关系就按照Sorting Layer的顺序面板进行渲染,先渲染Default层,再渲染backGround层,也就是说backGround层把前面的Default覆盖掉了
在这里插入图片描述
于是这次不是house覆盖crate,而是变成crate覆盖house

Order in Layer层级

该层级主要是针对不想改变Sorting Layer层级同时达到自己想渲染先后的问题
在这里插入图片描述
再次把crate的Sorting Layer层级改成和house层级一样,house覆盖掉crate
但是这次改变一下crate的Order in Layer层级
在这里插入图片描述
让crate的Order in Layer层级变成1,使得crate的渲染层级高于house
所以就变成:
在这里插入图片描述
crate覆盖住house

Layer层级

在这里插入图片描述
这里也是层级改变渲染关系,但是主要类似于场景物体的分类顺序
在这里插入图片描述

此时我让crate的Sorting Layer和Order in Layer跟house的一样,只改变crate的Layer变成Ground(Layer中也是原来只有5个,我的Ground是自己添加的,和上面的那个Sorting Layer添加方式一样)
在这里插入图片描述
但是并没有像自己预期的那样以为Ground的渲染层级大于Default使得覆盖house。所以Layer通常用来分类的,脚本中用到的Layer层级需要添加进行检测碰撞等等。

小结

搭建2D场景通常改变Sorting Layer和Order in Layer即可,在自己写脚本的或者一些情况下给物体分类加一些特有的Layer层级。

### 设置 SpriteRenderer 的渲染顺序 在 Unity 中,`SpriteRenderer` 组件提供了多种方式来控制其渲染顺序。主要方法是通过 `Sorting Layer` 和 `Order in Layer` 来实现。 #### 使用 Sorting Layer 控制渲染顺序 `Sorting Layer` 是一种全局定义的分层机制,允许开发者创建多个层次并指定这些层次之间的相对顺序。这使得可以在项目范围内统一管理不同对象间的渲染优先级[^1]。 要设置 `Sorting Layer`: 1. 打开 Inspector 面板中的 `Sprite Renderer` 组件; 2. 在 `Sorting Layer` 下拉菜单中选择现有的图层或点击加号 (+) 创建新的图层; 3. 调整所选图层与其他图层的关系以达到预期效果; #### 使用 Order In Layer 微调同层内元素次序 在同一 `Sorting Layer` 内部,还可以进一步微调各个 `SpriteRenderer` 的显示顺序。这是通过修改 `Order in Layer` 参数完成的——数值越大表示越靠前被渲染。 对于更复杂的情况,比如混合使用 `MeshRenderer` 和 `SpriteRenderer` 时,也可以为前者配置相同的属性 (`sortingLayerName`, `sortingOrder`) 实现一致性的排序逻辑[^2]。 ```csharp // C# 示例代码:动态调整 GameObject 上 SpriteRenderer 或 MeshRenderer 的排序参数 using UnityEngine; public class RenderOrderController : MonoBehaviour { public string sortingLayer; public int orderInLayer; void Start() { var spriteRenderer = GetComponent<SpriteRenderer>(); if (spriteRenderer != null){ spriteRenderer.sortingLayerName = sortingLayer; spriteRenderer.sortingOrder = orderInLayer; } var meshRenderer = GetComponent<MeshRenderer>(); if(meshRenderer != null){ // 对于 MeshRenderer, 只能通过脚本访问内部的 Sort Override Property MaterialPropertyBlock mpb = new MaterialPropertyBlock(); meshRenderer.GetPropertyBlock(mpb); mpb.SetInt("_StencilComp", orderInLayer); // 假设自定义着色器支持此功能 meshRenderer.SetPropertyBlock(mpb); // 更推荐的方式是在编辑器中手动设定或者利用其他API接口 typeof(MeshRenderer).GetProperty("material").SetValue(meshRenderer, materialWithCustomSortSettings); } } } ``` 需要注意的是,在某些特殊情况下(例如涉及透明度处理),即使设置了上述两项参数也可能因为材质本身的特性而影响最终呈现的效果。此时应考虑检查使用的 Shader 是否正确以及是否存在冲突的 Render Queue 设置[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值