撰写本文时使用Unity的版本为2017.4.10f1(64bit)

1.描述问题

  需求:通过UGUI制作一个界面之后,我需要在界面的后面跟前面各添加一个特效。

  问题:同一层级UI是最后渲染的,所以UI永远是在最上面

  Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

  Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

  解决:分别调整ui_effect1、imageWhile、ui_effect2这三个物品的渲染层级

2.层级知识补充

  https://blog.csdn.net/leansmall/article/details/66478412

3.解决方案

  需要设置层级的Object分为三种:UI、粒子系统、3D Object

  (1) UI:添加Canvas组件控制,勾选Override Sorting之后可以设置Sorting Layer和 Order in Layer

   Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

  (2) 粒子系统:设置Render下的Sorting Layer和 Order in Layer

  Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

  (3) 3D Object:

    a.代码修改Mesh Renderer的Sorting Layer和 Order in Layer,Mesh Renderer在预制体上无法直接修改,但是继承于Renderer ,是有Sorting Layer和 Order in Layer参数可以修改的

    Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

    Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

    b.挂上Sorting Group组件直接在预制体里修改

    Unity UGUI和特效(含粒子系统和3D Object)之间层级问题-LMLPHP

4.方案优化

  使用统一的脚本组件挂于UI或者特效上,用于设置当前Object及所有子物体的层级。

  优点:(1)组件统一,可以在代码里遍历修改

     (2)特效一般子物体很多,挂在根节点,不用逐个设置层级

using UnityEngine;

[ExecuteInEditMode]
public class UIDepth : MonoBehaviour
{
public int order = ;
public bool isUI = false; private void Start()
{
if(isUI)
{
Canvas canvas = GetComponent<Canvas>();
if(canvas == null)
{
canvas = gameObject.AddComponent<Canvas>();
} canvas.overrideSorting = true;
canvas.sortingOrder = order;
}
else
{
Renderer[] rs = GetComponentsInChildren<Renderer>();
foreach(var r in rs)
{
r.sortingOrder = order;
}
}
}
}

5.方案建议

  (1)界面分级:

  一级界面(层级设置只在0-10),二级界面(10-20),三级界面(30-40),出现层级问题只需调整对应级界面的层级,避免牵一发而动全身的情况,如:一级界面原本没有特效,后来加了一个特效,后面界面层级全都要调高

05-11 02:08