如果读者是从Unity 4.x时代过来的,可能都用过NGUI这个插件(后来也是土匪成了正规军),NGUI一大特点是可以靠transform位移的Z值进行遮挡排序,然而这个事情在UGUI成了难题(Sorting Layer、Inspector顺序等因素综合作为遮挡前置条件)。
如图所示,现在我们有三个Image,白红蓝。在Inspector中的顺序如下:
如果我们尝试让白色遮挡红色,按照NGUI的做法,我们把红色的Z值改为50,然而这种做法在UGUI直接现场寄。
其中一种解决办法是改一下Inspector顺序。
至于如果想动态地调整顺序,你可以参考如下代码:
// UIPosZSorter
// Originally written by AStar
// Modified and commented by Shepherd Zhu
// Sort the RectTransform by Z Pos.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIPosZSorter : MonoBehaviour
{private List<Transform> m_Transforms; // 存储子物体的Transform组件private void Awake(){m_Transforms = new List<Transform>(); // 初始化m_Transforms列表}private void Update(){// 清空m_Transforms列表m_Transforms.Clear();// 遍历所有子物体,将其Transform组件添加到m_Transforms列表中for (int i = 0; i < transform.childCount; i++){m_Transforms.Add(transform.GetChild(i));}// 根据子物体的localPosition.z属性进行排序m_Transforms.Sort((a, b) => b.localPosition.z.CompareTo(a.localPosition.z))// 根据排序后的顺序,设置子物体的SiblingIndexfor (int i = 0; i < m_Transforms.Count; i++){m_Transforms[i].SetSiblingIndex(i);}}
}
效果如图: