ui에 파티클을 표시하는 방법은 일반적으로 2가지 옵션이
있습니다
. 레이어가 있지만 UI 특수 효과가 많이 산재되어 있으면 레벨 관리가 쉽지 않고 여러 캔버스로 인해 일괄 처리 문제가 발생합니다.
이제 Github의 세 번째 방법인 Particle BakeMesh(버전 2018.2 이상)
: https://github.com /mob-sakai/ParticleEffectForUGUI
장점: UGUI처럼 전달할 수 있습니다. 계층적 순서를 위아래로 조정하고 마스크 처리를 허용합니다.
프로그램 비교
파티클 BakeMesh
원칙: 파티클 그리드와 텍스처가 ui 기본 구성 요소에서 직접 렌더링되도록 합니다. ParticleSystemRenderer.BakeMesh 및 ParticleSystemRenderer.BakeTrailsMesh
인터페이스를 사용합니다.
여기에서는 그리드 정보를 생성합니다.
코드 분석
UI입자
UIParticle은 파티클의 부모 개체입니다.
[RequireComponent(typeof(RectTransform))]
[RequireComponent(typeof(CanvasRenderer))]
public class UIParticle : MaskableGraphic
{
protected override void OnEnable()
{
UIParticleUpdater.Register(this);
CanvasRenderer는 Canvas에 포함된 UI 객체를 렌더링합니다.
UIParticleUpdater
Canvas.willRenderCanvases 리스너
internal static class UIParticleUpdater
{
[RuntimeInitializeOnLoadMethod]
private static void InitializeOnLoad()
{
Canvas.willRenderCanvases -= Refresh;
Canvas.willRenderCanvases += Refresh;
}
Q: Canvas.willRenderCanvases 리스너
A: 공식 설명: Canvas 렌더링이 시작되기 전에 호출되는 이벤트입니다.
이를 통해 캔버스 기반 요소가 렌더링을 시작하기 직전까지 처리/업데이트를 연기할 수 있습니다. 여기서 파티클을 생성하는 Mesh를 만든 다음 particle.canvasRenderer.SetMesh를 호출하여 파티클의
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();
}