特效和UI的層級關(guān)系
特效和UI是在同一個Camera下,同一個SortingLayer下顯示的蜕劝,
但是檀头,UI是在Canvas下統(tǒng)一管理渲染的,特效不是岖沛。
從其組件的父類繼承關(guān)系也可看出來:
- Canvas : Behaviour : Component暑始,需要RectTransform組件
- UI組件都繼承自Graphic,屬于UnityEngine.UI命名空間
- 特效ParticleSystem繼承自Component婴削,Component繼承自O(shè)bject
- 特效ParticleSystem必然帶有MeshRenderer組件
- SpriteRenderer 繼承自Render廊镜,Render繼承自Component
- MeshRenderer 繼承自Render
- 只要是Render,就有SortingLayer和OrderInLayer屬性
同一個Canvas下渲染層級是一樣的馆蠕,所以特效是無法插入到兩UI之間的
可以在需要顯示在特效上的UI加一個Canvas期升,重載OrderInLayer屬性,使其大于特效的OrderInLayer互躬。
如果這個UI上又要顯示新的特效播赁,則新特效層級OrderInLayer需要比這個UI的高才行。
所以需要設(shè)計一套框架吼渡,實現(xiàn)以下效果
- 1容为、可以在任意層級添加特效,彈出的新UI會覆蓋在特效之上
- 2寺酪、特效要支持mask裁切
- 3坎背、拓展一下,其他Render也可以顯示在UI層級之間寄雀;并且支持mask裁切
Mask裁切
要支持Mask裁切應(yīng)該涉及到shader
1得滤、UI自帶的Mask裁切原理(可以看淺談Unity uGUI Mask組件實現(xiàn)原理)
Masking is implemented using the stencil buffer of the GPU.
要讓自帶的Mask支持特效裁切,在特效的shader里加入如下代碼即可盒犹。
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
2懂更、自定義的UIMask裁切原理
雨松的方案
原理就是把Mask的裁切區(qū)域傳給粒子特效Shader,當(dāng)超出這個區(qū)域那么直接讓它完全透明即可急膀。粒子特效的源生shader大家可以去unity官網(wǎng)下載沮协,我在這里把需要修改的地方標(biāo)注給大家。
另一個方案(未測試)
拜讀大神博客久矣卓嫂。 一直仰慕慷暂!在下有一個方法可以更便捷的解決以上問題,也是我偶然翻查國外論壇找到的晨雳。創(chuàng)建兩個Shader行瑞,一個給粒子用奸腺,一個給UI Mask 用,兩個Shader的內(nèi)容均采用Build-in Shader的Particle-Additive 和 UI-Default。利用Shader 的 Stencil 功能蘑辑, 分別對兩個Shader加入以下內(nèi)容://UI Mask Stencil { Ref 1 Comp Always Pass Replace }//Paritcle Stencil { Ref 1 Comp equal }之后分別創(chuàng)建相應(yīng)材質(zhì)球洋机,將其賦予UIImage 和 想被遮罩的 Particle 即可。 如果看不見效果洋魂,調(diào)整一下Particle的位置。 親測可用喜鼓。
我們項目中的方案
我們自己使用了一套Shader副砍,UI-Default-Optimized.shader、UI-Default-Gray.shader等庄岖,然后要使用我們自己的UIMask豁翎,與系統(tǒng)的Mask不兼容。
系統(tǒng)的方案是使用Stencil隅忿,我們的方案是根據(jù)MaskRect區(qū)域改透明度
據(jù)說使用Stencil比較耗性能
我們的UIMask不支持不規(guī)則圖形的裁切心剥,只是用來裁切ScrollView滾動視界的區(qū)域