Unity5.x版本自带了关于UI和模型特效之间的遮挡排序功能。在Untiy编辑器中,按操作 Editor/Project Settings/Tags and Layer,设置我们预留的图像层。
一般情况下我们把UI分为3-4层(主界面 功能层 高层 弹窗层 ),因为Render是用UI来划分的 那么我们对象就是定义在界面之
间,比如 UIMain - UIMainObject 这样,我们先定义下Layer 然后 通过Order 来调整物体之间的遮挡关系。
下面附上UI层级调整的脚本。个人倾向于用代码管理图层关系,因为热更量少也更加灵活,如果用挂脚本的方式不够灵活。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIDepthCS : MonoBehaviour
{
private string sortinglayer;
private int sortingOrder;
private bool isUI;
/// <summary>
/// 设置层级数据
/// </summary>
/// <param name="isUIParm">是否是UI(分为3d和2d)</param>
/// <param name="sortinglayerParm">层级参数</param>
/// <param name="sortingOrderParm">层级内order值</param>
/// <param name="shaderChannels">shader频道</param>
public void SetLayerData(bool isUIParm,string sortinglayerParm,int sortingOrderParm,AdditionalCanvasShaderChannels shaderChannels)
{
sortinglayer = sortinglayerParm;
sortingOrder = sortingOrderParm;
isUI = isUIParm;
if(isUI)
{
Canvas canvas = this.GetComponent<Canvas>();
if(canvas == null)
{
canvas = this.gameObject.AddComponent<Canvas>();
gameObject.AddComponent<UnityEngine.UI.GraphicRaycaster>();
}
canvas.overrideSorting = true;
canvas.sortingOrder = sortingOrderParm;
canvas.sortingLayerName = sortinglayerParm;
canvas.additionalShaderChannels = shaderChannels;
}
else
{
Renderer[] renders = gameObject.GetComponentsInChildren<Renderer>();
for (int i = 0; i < renders.Length;i++)
{
Renderer render = renders[i];
render.sortingOrder = sortingOrderParm;
render.sortingLayerName = sortinglayerParm;
}
}
}
/// <summary>
/// 设置层级内序列值
/// </summary>
/// <param name="orderNum"></param>
public void SetLayerOrderNum(int orderNum)
{
sortingOrder = orderNum;
if (isUI)
{
Canvas canvas = this.GetComponent<Canvas>();
canvas.sortingOrder = orderNum;
}
else
{
Renderer[] renders = gameObject.GetComponentsInChildren<Renderer>();
for (int i = 0; i < renders.Length; i++)
{
Renderer render = renders[i];
render.sortingOrder = orderNum;
}
}
}
}