ui上面展示粒子一般來說有兩種方案
1.通過rendertexture渲染,可以完美處理層級問題,不過性能不好,多個錄影機
2.直接放到ui界面調整特效sort in layer,不過如果ui特效穿插多,層級不好管理,且多canvas造成合批問題
現在來第三種方法粒子BakeMesh(要2018.2以上版本)
來自Github:https://github.com/mob-sakai/ParticleEffectForUGUI
優點:可像UGUI一樣通過上下調整層級排序,接受Mask處理
各方案比較
粒子BakeMesh
原理:直接讓粒子的網格和貼圖在ui基礎元件裡面渲染
使用接口
ParticleSystemRenderer.BakeMesh和ParticleSystemRenderer.BakeTrailsMesh這裡是生成網格資訊
CanvasRenderer.SetMesh
CanvasRenderer.SetTexture
把mesh和texture扔給canvasRenderer渲染
代碼解析
UIParticle
UIParticle 是粒子的父物體
[RequireComponent(typeof(RectTransform))]
[RequireComponent(typeof(CanvasRenderer))]
public class UIParticle : MaskableGraphic
{
protected override void OnEnable()
{
UIParticleUpdater.Register(this);
CanvasRenderer渲染包含在Canvas中的UI對象,是一個Graphic必須的
UIParticleUpdater
Canvas.willRenderCanvases監聽
internal static class UIParticleUpdater
{
[RuntimeInitializeOnLoadMethod]
private static void InitializeOnLoad()
{
Canvas.willRenderCanvases -= Refresh;
Canvas.willRenderCanvases += Refresh;
}
private static void Refresh(UIParticle particle)
{
Profiler.BeginSample("[UIParticle] Bake mesh");
BakeMesh(particle);
Profiler.EndSample();
Profiler.BeginSample("[UIParticle] Set mesh to CanvasRenderer");
particle.canvasRenderer.SetMesh(particle.bakedMesh);
Profiler.EndSample();
}