游戏中,界面上有些按钮之上需要放置一个特效,或者有些区域显示比如image上显示一个特效,这时候如果再打开一个UI,我们需要让新的UI显示在特效上层,而不是被特效遮挡,这是就需要设置特效的渲染顺序。

设置特效的order in layer,新版的unity中,particle system可以直接设置render的order,但是特效中有些是使用particle system做的,有些又是直接用的图像动画等等,而类似MeshRender的order in layer是不能在编辑器直接设置的,

所以靠手工设置是不现实的,需要用脚本设置。

代码:

// 深度遍历设置所有 Render 的 SortingLayer
        public static void setRenderSortingLayerByActor(GameObject actor, int order, bool isRecursion)
        {
            if (null != actor)
            {
                UtilApi.setSpriteRenderSortingLayerByActor(actor, order);
                UtilApi.setParticleSystemSortingLayerByActor(actor, order);
                UtilApi.setMeshRenderSortingLayerByActor(actor, order);

                int childCount = actor.transform.childCount;
                int idx = 0;
                Transform childTrans = null;

                if (isRecursion)
                {
                    for (idx = 0; idx < childCount; ++idx)
                    {
                        childTrans = actor.transform.GetChild(idx);
                        UtilApi.setRenderSortingLayerByActor(childTrans.gameObject, order, isRecursion);
                    }
                }
            }
        }

static public void setSpriteRenderSortingLayerByActor(UnityEngine.GameObject actor, int order)
        {
            if (null != actor)
            {
                SpriteRenderer render = null;
                render = actor.GetComponent<SpriteRenderer>();

                UtilApi.setSpriteRenderSortingLayerBySpriteRenderer(render, order);
            }
        }

/**
         * @brief  unity渲染层级关系小结
         * @ref http://blog.csdn.net/meegomeego/article/details/42060389
         */
        // 可以在编辑器中设置
        static public void setSpriteRenderSortingLayerBySpriteRenderer(SpriteRenderer render, int order)
        {
            if (null != render && render.sortingOrder != order)
            {
                render.sortingOrder = order;
            }
        }

static public void setParticleSystemSortingLayerByActor(UnityEngine.GameObject actor, int order)
        {
            if (null != actor)
            {
                ParticleSystem particleSystem = null;
                particleSystem = actor.GetComponent<ParticleSystem>();

                UtilApi.setParticleSystemSortingLayer(particleSystem, order);
            }
        }

// 不能在编辑器中设置
        static public void setParticleSystemSortingLayer(ParticleSystem particleSystem, int order)
        {
            if (null != particleSystem)
            {
                Renderer render = particleSystem.GetComponent<Renderer>();
                if (null != render && render.sortingOrder != order)
                {
                    render.sortingOrder = order;
                }
            }
        }

static public void setMeshRenderSortingLayerByActor(UnityEngine.GameObject actor, int order)
        {
            if (null != actor)
            {
                UnityEngine.MeshRenderer meshRenderer = null;
                meshRenderer = actor.GetComponent<UnityEngine.MeshRenderer>();

                UtilApi.setMeshRenderSortingLayer(meshRenderer, order);
            }
        }

// 不能在编辑器中设置
        static public void setMeshRenderSortingLayer(UnityEngine.MeshRenderer meshRenderer, int order)
        {
            if (null != meshRenderer && meshRenderer.sortingOrder != order)
            {
                meshRenderer.sortingOrder = order;
            }
        }
View Code

相关文章: