天天看點

Unity3d:UGUI,UI與特效粒子層級,2018.2以上版本BakeMesh,粒子在兩個Image之間且在ScrollView

ui上面展示粒子一般來說有兩種方案

1.通過rendertexture渲染,可以完美處理層級問題,不過性能不好,多個錄影機

2.直接放到ui界面調整特效sort in layer,不過如果ui特效穿插多,層級不好管理,且多canvas造成合批問題

現在來第三種方法粒子BakeMesh(要2018.2以上版本)

來自Github:https://github.com/mob-sakai/ParticleEffectForUGUI

優點:可像UGUI一樣通過上下調整層級排序,接受Mask處理

各方案比較

Unity3d:UGUI,UI與特效粒子層級,2018.2以上版本BakeMesh,粒子在兩個Image之間且在ScrollView

粒子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();
        }