您的位置:

Unity Sorting Layer的使用技巧

一、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视觉效果的优化,从而在游戏开发过程中提高工作效率和游戏效果的质量。