Unity UGUI渲染顺序

 

 

Shader "UI/Overlay"
{
	Properties
	{
		[PerRendererData] _MainTex ("Font Texture", 2D) = "white" {}
		_Color("Tint", Color) = (1,1,1,1)
		_StencilComp ("Stencil Comparison", Float) = 8
		_Stencil ("Stencil ID", Float) = 0
		_StencilOp ("Stencil Operation", Float) = 0
		_StencilWriteMask ("Stencil Write Mask", Float) = 255
		_StencilReadMask ("Stencil Read Mask", Float) = 255
		_ColorMask ("Color Mask", Float) = 15
	}
	
	SubShader
	{
		LOD 100

		Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
			"PreviewType"="Plane"
			"CanUseSpriteAtlas" = "True"
		}

		Stencil
		{
			Ref [_Stencil]
			Comp [_StencilComp]
			Pass [_StencilOp] 
			ReadMask [_StencilReadMask]
			WriteMask [_StencilWriteMask]
		}
		
		Cull Off
		Lighting Off
		ZWrite Off
		ZTest Always
		Offset -1, -1
		Blend SrcAlpha OneMinusSrcAlpha
		ColorMask [_ColorMask]

		Pass
		{
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"
				#include "UnityUI.cginc"

				struct appdata_t
				{
					float4 vertex : POSITION;
					float2 texcoord : TEXCOORD0;
					float4 color : COLOR;
				};
	
				struct v2f
				{
					float4 vertex : SV_POSITION;
					half2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};
	
				sampler2D _MainTex;
				float4 _MainTex_ST;
				fixed4 _Color;
				fixed4 _TextureSampleAdd;
				
				v2f vert (appdata_t v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
					o.color = v.color * _Color;
#ifdef UNITY_HALF_TEXEL_OFFSET
					o.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
#endif
					return o;
				}
				
				fixed4 frag (v2f i) : SV_Target
				{
					fixed4 col = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color;
					 clip (col.a - 0.01);
					return col;
				}
			ENDCG
		}
	}
}

### Unity UGUI 渲染顺序与层级管理 在 UnityUGUI 系统中,渲染顺序主要通过 `Canvas` 组件及其子对象的属性来控制。以下是关于如何调整渲染顺序的关键点: #### 1. **Canvas 属性** `Canvas` 是 UI 元素的基础容器,其渲染顺序受以下几个因素的影响: - **Render Mode**: 定义了 Canvas 的渲染模式,例如 `Screen Space - Overlay`, `Screen Space - Camera`, 和 `World Space`[^3]。 - **Sorting Layer**: 设置整个 Canvas 所属的排序层,决定了与其他 Canvas 或游戏对象的关系。 - **Order in Layer**: 在同一 Sorting Layer 中进一步细化渲染顺序。 #### 2. **Sorting Layer** `Sorting Layer` 是全局的概念,用于定义不同组别的渲染级。可以通过以下方式修改: - 在 Unity 编辑器中,进入菜单栏 `Edit -> Project Settings -> Tags and Layers` 来配置自定义 Sorting Layer。 - 将 Canvas 或其他 UI 对象的 `Sorting Layer` 属性设置为所需的层名[^1]。 #### 3. **Order in Layer** 在同一 `Sorting Layer` 下,`Order in Layer` 提供更精细的控制。较大的数值表示更高的渲染级。可以在 Inspector 面板中直接调整该值。 #### 4. **粒子系统 (Particle System)** 如果项目中有 Particle System 并希望它与 UI 正确交互,则需要为其分配合适的 `Sorting Layer ID` 和 `Order in Layer` 值[^2]。 #### 示例代码 以下是一个简单的脚本示例,展示如何动态更改某个 GameObject 的 Sorting Layer 和 Order in Layer: ```csharp using UnityEngine; public class ChangeRenderingOrder : MonoBehaviour { public string targetSortingLayerName = "UI"; public int newOrderInLayer = 10; void Start() { Renderer rendererComponent = GetComponent<Renderer>(); if (rendererComponent != null) { rendererComponent.sortingLayerName = targetSortingLayerName; rendererComponent.sortingOrder = newOrderInLayer; } } } ``` 此脚本适用于带有 `Renderer` 组件的对象(如 Sprite)。对于纯 UGUI 元素,可以直接操作 Canvas 或 Graphic 的相应字段。 --- ### 总结 为了有效管理 Unity UGUI渲染顺序,应合理利用 `Canvas` 的 Render Mode、Sorting Layer 及 Order in Layer 参数。这些工具共同作用于最终的画面表现上,确保各层次间的视觉逻辑清晰有序[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值