Unity NGUI 粒子的排序

Unity NGUI系統中是沒有對粒子進行排序的,如:html

 

 

怎麼解決這個問題呢?spa

思路是把粒子的渲染層級,相對於UI組件的層級進行一個偏移。code

解決後的效果以下:orm

 

 

代碼以下:htm

 1 using System.Collections.Generic;
 2 using UnityEngine;
 3 
 4 public class UIRenderQueueSorter : MonoBehaviour
 5 {
 6     [SerializeField]
 7     UIWidget m_source;
 8     [SerializeField]
 9     int m_offset;
10     [SerializeField]
11     List<Renderer> m_renderers = new List<Renderer>();
12 
13     public void Initialize()
14     {
15         Renderer[] renders = transform.GetComponentsInChildren<Renderer>(true);
16         m_renderers.AddRange(renders);
17     }
18 
19     void Update()
20     {
21         if (m_source && m_renderers.Count > 0)
22         {
23             for (int i = 0; i < m_renderers.Count; i++)
24             {
25                 Renderer r = m_renderers[i];
26                 if (r && r.sharedMaterial && m_source.drawCall != null)
27                     r.sharedMaterial.renderQueue = m_source.drawCall.renderQueue + m_offset;
28             }
29         }
30     }
31 
32     public void AddRenderer(Renderer r)
33     {
34         if (!m_renderers.Contains(r))
35         {
36             m_renderers.Add(r);
37         }
38     }
39 
40     public void ClearAllRenderers()
41     {
42         m_renderers.Clear();
43     }
44 
45     public UIWidget Source
46     {
47         set { m_source = value; }
48     }
49 
50     public int Offset
51     {
52         set { m_offset = value; }
53     }
54 }

用法:blog

1                     // 特效排序
2                     var sorter = m_effect.AddComponent<UIRenderQueueSorter>();
3                     sorter.Source = m_itemTexture;
4                     sorter.Offset = 1;
5                     sorter.Initialize();

此腳本將掛在須要排序的粒子的父節點上:排序

 

轉載請註明出處:http://www.javashuo.com/article/p-sjuyzgfn-ht.htmlget

相關文章
相關標籤/搜索