問題背景:
在做主線任務時發現完成任務后的特效顯示穿透上面的UI層,不美觀,策划不樂意了,抓緊解決下
解決思路:
首先講下影響渲染順序的因素:
能夠影響渲染順序的因素有:
1、Camera Depth
相機組件上設置的相機深度,深度越大越靠后渲染。
2、Sorting Layer
在Tags & Layers設置中可見
3、Order In Layer
相對於Sorting Layer的子排序,用這個值做比較時只有都在同一層時才有效。
4、RenderQueue
Shader中對Tags設置的“Queue”。
影響程度:
1、Camera Depth
永遠最高。Camera Depth小的一定先進渲染管線。
2、當Sorting Layer和Order In Layer相同時
RenderQueue小的先進渲染管線。
3、當Sorting Layer和Order In Layer不相同時!兩種情況
1. 當兩個材質使用了不同的RenderQueue,且這兩個RenderQueue都在[0~2500]或[2501~5000]時,SortingLayer和OrderInLayer的排序生效。
2. 當兩個材質使用了不同的RenderQueue,且這兩個RenderQueue分別在[0~2500]和[2501~5000]時,則一定會按照RenderQueue繪制,無視SortingLayer、OrderInLayer的排序。
在這只說兩種:
1.調節粒子系統Particle System中Order in Layer
這里注意下Sorting Layer和Order in Layer 的區別
在Sorting Layer中可以Add Sorting Layer ,顯示的優先級為從上到下 (不同層)。
在 Order in Layer 中我們可以指定同一層Sorting Layer 的優先級(同一層級)
比如 兩個游戲物體的Sorting Layer同為role層 ,但是第一個游戲物體的Order in Layer 為0,而第二個游戲物體的Order in Layer 為1 ,則第二個游戲物體的顯示優先級高於第一個游戲物體。
不過研究發現,此方式使用2DSprite,通過層級設置,但是Image不行
2.粒子系統的渲染隊列Render Queue
我在這里采取了這種方式,是這樣,策划的要求是不能動當前粒子特效自身的效果,並且有上層UI時不能穿透
首先不能動當前粒子特效的效果也就意味這,顯示特效時如果調了特效的渲染隊列,就變了特效的效果,第二有上層UI時還不能穿透,我就想那就動態控制下這粒子的渲染隊列吧,這地方也簡單,就是有上層UI時和沒有時切換下狀態就OK了
查看了下美術的粒子效果時shader中的渲染隊列值分別如圖:
並且自己手動調整了下看了下達到策划需求時的渲染隊列值要小於3001即可,其子特效如下:
是3000,而要求是低於2900才可以達到效果。
好不多說,代碼很簡單。
具體代碼:
1 Coroutine ControlEffectRenderCor; 2 IEnumerator FindControlEffectRender(int QueueValueOne,int QueueValueTwo) 3 { 4 while (ControlEffectRender==null) 5 { 6 yield return null; 7 } 8 Material[] materArr= ControlEffectRender.GetComponent<ParticleSystem>().GetComponent<Renderer>().materials; 9 for (int i = 0; i < materArr.Length; i++) 10 { 11 materArr[i].renderQueue = QueueValueOne; 12 } 13 ControlEffectRender.transform.GetChild(0).GetComponent<ParticleSystem>().GetComponent<Renderer>().material.renderQueue = QueueValueTwo; 14 }
就這個簡單的函數實現,
這里ControlEffectRender指的是特效GameObject,這樣就OK了。
新手上路,很多都是不解原理,達不到對症下葯,只知道這種病症症狀這種葯可緩解,歡迎各位前輩指點提攜