Unity UGUI和特效(含粒子系统和3D Object)之间层级问题
撰写本文时使用Unity的版本为2017.4.10f1(64bit)
1.描述问题
需求:通过UGUI制作一个界面之后,我需要在界面的后面跟前面各添加一个特效。
问题:同一层级UI是最后渲染的,所以UI永远是在最上面
解决:分别调整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
(2) 粒子系统:设置Render下的Sorting Layer和 Order in Layer
(3) 3D Object:
a.代码修改Mesh Renderer的Sorting Layer和 Order in Layer,Mesh Renderer在预制体上无法直接修改,但是继承于Renderer ,是有Sorting Layer和 Order in Layer参数可以修改的
b.挂上Sorting Group组件直接在预制体里修改
4.方案优化
使用统一的脚本组件挂于UI或者特效上,用于设置当前Object及所有子物体的层级。
优点:(1)组件统一,可以在代码里遍历修改
(2)特效一般子物体很多,挂在根节点,不用逐个设置层级
using UnityEngine;
[ExecuteInEditMode]
public class UIDepth : MonoBehaviour
{
public int order = 100;
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),出现层级问题只需调整对应级界面的层级,避免牵一发而动全身的情况,如:一级界面原本没有特效,后来加了一个特效,后面界面层级全都要调高