Unity渲染顺序(1)

添加排序层级

在这里插入图片描述
在Unity编辑器的右上角选择Layers 按钮,在下拉菜单中点击Edit Layers…选项,将显示当前Unity的Tags, Sorting Layers,和Layers 编辑选项。
在这里插入图片描述
Sorting Layers是Unity中对排序的层级的定义块,在面板中越靠后的排序层级越高。Default 是默认的层级,我们添加First 和 Default 两个排序层级为之后的排序测试做准备。

Canvas

  • 简介
    Canvas 组件作为UI对象的承载组件,也就是说UI的对象将经由Canvas才能绘制到我们的屏幕上,任何的UI对象将必须是Canvas组件对象的子节点,当场景中不存在Canvas组件对象,我们创建一个UI,系统将会创建一个Canvas,并且将该对象添加为其的子节点。

  • UI在Canvas上的渲染顺序
    在这里插入图片描述

在这里插入图片描述

在Canvas中,UI对象的渲染顺序将根据在Canvas中父子关系树状渲染,1,2 处于同级关系,因为2在面板中靠后,所以将先渲染 1,1的子节点3,再渲染 2。

  • RenderMode(画布渲染模式)
    前面介绍的是UI对象在画布上的渲染顺序,那么画布在场景中的绘制顺序将由画布的渲染模式决定。

    1. Screen Space - Overlay 模式
      在这里插入图片描述
      屏幕空间-覆盖模式的画布会填满整个屏幕空间,并将画布下面所有的UI元素置于屏幕的最上层,或则说画布的画面永远“覆盖”在其他普通的3D画面,如果屏幕尺寸被改变,画布将自动改变尺寸来匹配屏幕。

      那么当场景中有多个覆盖模式的画布,它们怎么确认谁的层级更高呢?
      在覆盖模式下,有一个Sort Order的属性,它是一个Canvas的排序属性,是一个int类型,当他的数值越到,那么Canvas的层级也就越高。

    2. Screen Space - Camera 模式
      在这里插入图片描述
      屏幕空间-摄影机模式 和 Screen Space - Overlay模式类似,画布也是填满整个屏幕空间,如果屏幕尺寸改变,画布也会自动改变尺寸来匹配屏幕。所不同的是,在该模式下,画布会被放置到摄影机前方。在这种渲染模式下,画布看起来是绘制在一个与摄影机固定距离的平面上。所有的UI元素都由该摄像机渲染。因此摄像机的设置会影响到UI画面。

      为什么要有两个填满空间的画布模式呢?
      覆盖模式下是不需要相机的,也就是它的顺序跟我们的世界是无关的,我们没办法控制画布和2D的物体的渲染先后层级,它总是在2D物体的上面。引入相机模式也是为了让我们的画布可以与2D物体去做层级上的调整。

    3. World Space 模式
      在这里插入图片描述
      世界控件模式,在此模式下,画布被视为与场景中其他普通游戏对象性质相同的游戏物体。
      为什么要引入世界模式
      前两种模式都是覆盖屏幕的,随着分辨率的调整,他们也会不断的调整画布的大小以充满屏幕,而我们可能需要一个固定大小的画布,所以引入了世界控件的模式

    在这里插入图片描述

    上述Screen SpaceWorld Space 模式的排序层级通过设置SortingLayer 和 Order in Layer的值来确定,在SortingLayer 不同情况下,靠后的层级越高,当SortingLayer 一致的时候,将根据Order in Layer(层级上的排序)的数值越大,排序层级越高。

Unity引擎中,动态修改渲染顺序通常涉及到自定义Renderers和Sorting Layers。Sorting Layer是Unity用于控制游戏物体渲染顺序的一种机制,你可以通过代码动态地改变游戏对象所属的Sorting Layer。 1. **添加Sorting Layer**:首先,你需要确保场景中有足够的Sorting Layers,并为每个层级分配一个唯一的标识。可以右键点击"Project"窗口中的"Sorting Layers",然后选择"Add Sorting Layer"添加新的排序层。 2. **设置Renderer属性**:在你的游戏中创建一个脚本,比如继承自`MonoBehaviour`,并给需要动态调整渲染顺序的游戏物体添加这个脚本。在脚本中,你可以获取或设置` sortingLayerName`和`sortingOrder`属性。例如: ```csharp public class DynamicRenderer : MonoBehaviour { public string targetSortingLayer = "Default"; private RenderSettings settings; void Start() { settings = RenderSettings.renderSettings; } public void ChangeRenderOrder(int order) { settings.sortingLayerName = targetSortingLayer; settings.sortingOrder = order; ApplyChanges(); } // 添加一个方法来应用更改,如果Unity支持实时更新 protected virtual void ApplyChanges() { RenderingManager.submitFrame(); } } ``` 3. **触发渲染顺序变化**:当你想改变某物体的渲染顺序时,只需调用`ChangeRenderOrder`方法并传入你想要的新排序顺序即可。 请注意,这种做法可能不会立即生效,因为它依赖于Unity渲染循环。如果你想即时看到效果,你可能需要在`OnDrawGizmos`等图形相关的回调中应用更改,或者手动调用`ApplyChanges()`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静水流深&1111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值