[Unity]NGUI之RenderQueue

May 10, 2017


之前在做特效被UI遮挡时,我们是使用了修改UI和特效的RenderQueue的方法来避免这一问题的。

现在我们通过扩展UIPanel来将我们要绘制的物体插入RenderQueue队列中,来达到之前的目的。

在我们自定义的要显示的物体上挂载如下脚本:

using UnityEngine;  
using System.Collections;  
  
public class RenderQueueUtil : MonoBehaviour  
{  
    public UIPanel targetPanel;  
    public UIWidget targetGameObject;  
    private Renderer renderer;  
    private int lasetQueue = int.MinValue;  
    void Awake()  
    {  
        renderer = GetComponent<Renderer>();  
    }  
    void OnEnable()  
    {  
        AddToPanel();  
    }  
    void AddToPanel()  
    {  
        if (targetPanel != null) targetPanel.renderQueueUtils.Add(this);  
    }  
    void OnDisable()  
    {  
        targetPanel.renderQueueUtils.Remove(this);  
    }  
    public void setQueue(int queue)  
    {  
        if (this.lasetQueue != queue)  
        {  
            this.lasetQueue = queue;  
            renderer.material.renderQueue = this.lasetQueue;  
        }  
    }  
}  

然后对UIPanel.cs进行下扩展:

public BetterList<RenderQueueUtil> renderQueueUtils   
                  = new BetterList<RenderQueueUtil>();  
  
void UpdateDrawCalls ()  
{  
    ......  
  
    int renderQueueValue = -1;  
  
    for (int i = 0; i < drawCalls.size; ++i)  
    {  
        renderQueueValue += 1;  
  
        ......  
  
           BetterList<RenderQueueUtil> queueList = FindModifier(dc);  
        if (queueList.size > 0)   
           {  
               for (int j = 0; j < this.renderQueueUtils.size; j++)  
               {  
                renderQueueValue += 1;  
                   RenderQueueUtil util = queueList.buffer[j];  
                   util.setQueue(startingRenderQueue + renderQueueValue);  
            }  
        }  
      
    }  
}  
  
   public BetterList<RenderQueueUtil> FindModifier(UIDrawCall dc)   
{  
       BetterList<RenderQueueUtil> queueList = new BetterList<RenderQueueUtil>();  
  
       for (int i = 0; i < this.renderQueueUtils.size; ++i)  
    {  
           RenderQueueUtil util = this.renderQueueUtils.buffer[i];  
           if (util.targetPanel != null && util.targetGameObject.drawCall !=  
                                null && util.targetGameObject.drawCall == dc)  
           {  
               queueList.Add(util);  
        }  
    }  
    return queueList;  
}  

指定所挂载脚本所在的UIPanel和对照的目标,就能实现插入到RenderQueue了。