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),出现层级问题只需调整对应级界面的层级,避免牵一发而动全身的情况,如:一级界面原本没有特效,后来加了一个特效,后面界面层级全都要调高

posted @ 2019-04-17 11:50  Don_Yao  阅读(7076)  评论(2编辑  收藏  举报