[Unity]Unity特效与UI遮挡的问题

May 11, 2016


最近给UI添加粒子特效时,总是被UI遮挡。因为粒子系统的渲染顺序列默认为3000,而NGUI的渲染顺序默认也是从3000开始,当有嵌套的panel时或者Depth更高的panel时,GUI的渲染顺序会高于3000。

解决办法是:

1.修改NGUI中的UIPanel脚本中的默认的RenderQueue, 调整到3000以下,这样就不会遮挡住粒子特效了,当有的窗口需要显示在特效上面时,在检视面板中把该窗口的Renderer Q选项调整为Start At,值为3000以上,就可以解决。

2.使用另外一个摄像机,显示特效。但是在UI窗口相互切换时,不太好控制。

3.修改粒子特效的Shader中的RendererQueue值。

下面给出第三种方法的代码参考:

using UnityEngine;  
using System.Collections;  
  
public class ChangeParticleSysRenderQueue : MonoBehaviour  
{  
    public bool setRenderQueue;         //是否设置粒子的RenderQueue  
    public int  effectRendererQueue;     //粒子RenderQueue的大小  
  
    public bool IsChangeAllRenderers = false;  
  
    private void ChangeEffectRender()  
    {  
        ParticleSystem[] particles = GetComponentsInChildren<ParticleSystem>();  
        if (particles != null)  
        {  
            foreach (ParticleSystem myParticles in particles)  
            {  
                ChangeRendererSetting(myParticles.renderer);  
            }  
        }  
  
        if (IsChangeAllRenderers)  
        {  
            Renderer[] renderers = GetComponentsInChildren<Renderer>();  
            if (renderers != null)  
            {  
                foreach (var myRenderer in renderers)  
                {  
                    ChangeRendererSetting(myRenderer);  
                }  
            }  
        }  
    }  
  
    private void ChangeRendererSetting(Renderer render)  
    {  
        if (render == null)  
        {  
            Debug.LogWarning("------>null.");  
            return;  
        }  
        if (setRenderQueue)  
        {  
            render.material.renderQueue = effectRendererQueue;  
        }  
    }  
  
    void OnEnable ()   
    {  
        ChangeEffectRender();  
    }  
}