一、Sorting Layer的概念
Unity Sorting Layer 是 Unity 游戏引擎提供的一个比较重要的功能,它是用于控制场景中物体的层级顺序的。在一个Unity的情况下,场景中的所有物体都在同一层级上,如果不开启Sorting Layer的话,那么无法实现一个物体盖住另一个物体的效果。
为方便理解,将场景物体比喻成一张纸,那么Sorting Layer就是控制纸张的层次,即图层。当两张纸重叠在一起时,我们就能够看到其中一张纸。同理,当两个物体的位置重叠在一起时,能看到的是在更高Sorting Layer上的那个物体。
Sorting Layer 的使用,可以让开发者很好的控制游戏对象之间的层级顺序,方便特定游戏场景下的对象渲染,以及UI视觉效果的优化。
二、Sorting Layer的用法
1、Sorting Layer的创建和修改
Unity默认有一个叫做Default的Sorting Layer,我们可以在场景面板中选择一个游戏对象,然后在Inspector面板的Renderer组件中修改Sorting Layer的数值,也可以在层级面板中新建Sorting Layer并命名。以在Unity中创建一个名叫"On Top"的Sorting Layer为例:
// 在Unity Editor中
1. 打开Layers面板(快捷键:Ctrl+Shift+L)
2. 点击滑动条下方的加号图标,添加一个新Sorting Layer,并将名称改为"On Top"
3. 在Inspector中选择某一个游戏对象,将其Sorting Layer设置为"On Top"即可
也可以通过代码的方式进行设置,以下代码演示了计算机语言如何创建和修改Sorting Layer。
// C# Code
using UnityEngine;
using UnityEditor;
public class ModifySortingLayer
{
[MenuItem("Custom/Sorting Layer/On Top Layer")]
static void CreateSortingLayer()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty layersProp = tagManager.FindProperty("layers");
const string name = "On Top";
bool layerExists = false;
for (int i = 8; i < layersProp.arraySize; i++)
{
SerializedProperty layerProp = layersProp.GetArrayElementAtIndex(i);
if (layerProp != null && layerProp.stringValue == name)
{
layerExists = true;
break;
}
}
if (!layerExists)
{
SerializedProperty layerProp = layersProp.GetArrayElementAtIndex(8);
layerProp.stringValue = name;
}
tagManager.ApplyModifiedProperties();
// 可以在此基础上进行修改默认GameObject的Sorting Layer
}
}
2、Sorting Order的用法
Sorting Order可以简单的理解为当前Gameobject在Sorting Layer内的层级顺序。默认情况下,Sorting Order为0,数值越大的Gameobject在移动时层级越高,越靠近摄像机视角,注意只是相对视觉效果而言。
要更改Sorting Order,您可以从Inspector面板中输入一个新值或通过代码来更改它。以下代码演示了如何在代码中更改Sorting Order。
// C# Code
using UnityEngine;
public class moveObject : MonoBehaviour
{
public void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
transform.position += Vector3.forward;
GetComponent
().sortingOrder = 1;
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.position += Vector3.back;
GetComponent
().sortingOrder = -1;
}
}
}
在该代码中,以向前移动物体为例,物体位置向前移动一个单位后,Sorting Order设置为1。
三、Sorting Layer的一些应用实例
1、多层地图渲染
使用 Sorting Layer 可以实现更加逼真的地图渲染,比如具有多个层的背景,在添加 Object Animation (例如车、飞机)时,你可以链式设置多个 Sorting Layer 让不同区域默认具有不同优先级,呈现出立体感效果。以下代码演示了如何使用 Sorting Layer 实现多层地图渲染。
using UnityEngine;
public class Parallax : MonoBehaviour
{
[SerializeField] private float repeatWidth;
[SerializeField] private GameObject bg1;
[SerializeField] private GameObject bg2;
private void Start()
{
bg1.GetComponent
().sortingLayerName = "Foreground";
bg2.GetComponent
().sortingLayerName = "Background";
}
private void Update()
{
if (bg1.transform.position.x < -repeatWidth)
{
bg1.transform.position += new Vector3(repeatWidth * 2, 0, 0);
}
if (bg2.transform.position.x < -repeatWidth)
{
bg2.transform.position += new Vector3(repeatWidth * 2, 0, 0);
}
}
}
该代码演示了双层背景的移动,使背景视觉上具有动感。
2、UI渲染层级控制
Sorting Layer 也可以用于 Unity 的 UI 系统中,UI渲染的方式不同于2D和3D物体,它与锚点组件结合使用可以灵活的控制UI渲染的层级顺序。以下代码演示了如何使用 Sorting Layer 控制UI渲染。
using UnityEngine;
using UnityEngine.UI;
public class ButtonChange : MonoBehaviour
{
[SerializeField] private Image buttonBg;
private void Start()
{
GetComponent
该代码演示了如何将UI控件所在的图层调整到指定层级,此处为"On Top"。
3、角色渲染效果
在一定程度上,Sorting Layer 的运用可以给角色的表现和感受都带来巨大的提升。在角色运动的过程中,更好的实现是相对于其他场景,角色和前景地物之间的交互问题。
可以选用一个初始设定的Sort Layer -"Default"对场景物体进行排序。并将角色的Sorting Layer调整为一个大于默认Sorting Layer的数值(例如5)。这样一来,无论角色与其他物体如何飞快地移动,我们都能够清晰的看到角色在场景中扮演的明显角色和移动位置,增强了游戏场景的真实感。
结语
本文对Sorting Layer的使用进行了详细的介绍和演示,通过代码实现了创建和修改Sorting Layer,以及修改GameObject的Sorting Order等操作,并通过实例演示了Sorting Layer在多层地图渲染、UI渲染以及角色渲染效果的应用。通过掌握Sorting Layer的使用技巧,开发者可以更好地控制游戏对象之间的层级顺序,方便特定游戏场景下的对象渲染,以及UI视觉效果的优化,从而在游戏开发过程中提高工作效率和游戏效果的质量。