рдПрдХрддрд╛ UI рдореЗрдВ рджреГрд╢реНрдп рдШрдЯрдХ рдмрдирд╛рдПрдБред рдХрдг рдкреНрд░рдгрд╛рд▓реА

рдирдорд╕реНрддреЗ! рдпрд╣ рд▓реЗрдЦ рдХреИрдирд╡рд╕ рдИ рдореЗрдВ рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдЖрдИ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЬрд╛рд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЫрд╡рд┐


рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рд╕рд╛ рдпрд╛ рдЬрд╣рд╛рдВ рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП


рдПрдХрддрд╛ рдХреЗ рдпреВрдЖрдИ рдХрд╛ рдЖрдзрд╛рд░ рдХреИрдирд╡рд╕ рд╣реИ ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдорд▓реНрдЯреАрд▓реЗрдпрд░" рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШрдЯрдХ рдХреЛ рдЧреНрд░рд╛рдлрд┐рдХ рд╡рд░реНрдЧ (рдпрд╛ рдЙрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдорд╛рд╕реНрдХрдмрд▓рдЧреНрд░рд╛рдлрд┐рдХ рдХреНрд▓рд╛рд╕) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдирд╡рд╕ рд░реЗрдВрдбрд░рд░ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ OnPopulateMesh рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдХ рдХреЛ рдЕрдкрдиреА рдЬреНрдпрд╛рдорд┐рддрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рддрддреНрд╡ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛) рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд░реНрдЯреЗрдХреНрд╕ рд╣реЗрд▓реНрдкрд░ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг


рдЖрдзрд╛рд░


рд╣рдо рдПрдХ UIParticleSystem рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ MaskableGraphic рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред MaskableGraphic рдЧреНрд░рд╛рдлрд┐рдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред OnPopulateMesh рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред рдПрдХ рдЬрд╛рд▓ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдЬрд╛рд▓ рдХреЗ рдХреЛрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП VertexHelper рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

public class UIParticleSystem : MaskableGraphic { protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); ... int particlesCount = ... ; for (int i = 0; i < particlesCount; i++) { Color vertexColor = ... ; Vector2[] vertexUV = ... ; UIVertex[] quadVerts = new UIVertex[4]; for (int j = 0; j < 4; j++) { Vector3 vertixPosition = ... ; quadVerts[j] = new UIVertex() { position = vertixPosition, color = vertexColor, uv0 = vertexUV }; } vh.AddUIVertexQuad(quadVerts); } } } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ Clear Method рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рд╕реЗ VertextHelper рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, AddUIVertexQuad рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ 4 рдХреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдПрдХ рдЖрдпрдд рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ UIVertex рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдХреИрди рдХреА рд╕реНрдерд┐рддрд┐, рд░рдВрдЧ рдФрд░ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

VertexHelper
рд╡рд░реНрдЯреЗрдХреНрд╕ рд╣реЗрд▓реНрдкрд░ рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реИ, рд╕рд╛рде рд╣реА рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЛрдбрд╝реА рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди AddUIVertexStream рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХреЛрдиреЗ рдХреА рд╕реВрдЪреА рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХрдгреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐, рдЙрдирдХреЗ рд░рдВрдЧ рдФрд░ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛, рдЙрдирдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрд╛рд▓ рдХреЛ рднреА рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реНрд░реЗрдо SetVerticesDirty рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ OnPopulateMesh рдкрджреНрдзрддрд┐ рдХреЙрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА ред рдЗрд╕реА рддрд░рд╣ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ SetMaterialDirty рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

 protected void Update() { SetVerticesDirty(); } 

рдореЗрди рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдмрдирд╛рд╡рдЯ рдХреИрдирд╡рд╕ рд░реЗрдВрдбрд░ рдХреЛ рдкрд╛рд╕ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА , _MainTex shader рд╕рдВрдкрддреНрддрд┐ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ ParticleImage рдлрд╝реАрд▓реНрдб рдмрдирд╛рдПрдВ, рдЬрд┐рд╕реЗ mainTexture рдкреНрд░реЙрдкрд░реНрдЯреА рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 public Texture ParticleImage; public override Texture mainTexture { get { return ParticleImage; } } 

рдХрдг рдкреНрд░рдгрд╛рд▓реА


рдореЗрд╖ рдХреЛрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкрд╛рд░реНрдЯрд┐рдХрд▓ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрдгреЛрдВ рдХреЗ рд╕реНрдерд╛рди, рдЙрдирдХреЗ рдЖрдХрд╛рд░, рд░рдВрдЧ рдЖрджрд┐ рдкрд░ рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред
ParticleSystemRenderer рдШрдЯрдХ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХрдг рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреНрдп рдШрдЯрдХ, UIParticleSystem рдФрд░ CanvasRenderer, рдореЗрд╖ рдмрдирд╛рдиреЗ рдФрд░ UI рдореЗрдВ рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреЗред

рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд╡реЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрд░рдВрдн рдХрд░реЗрдВред

UIBehaviour
рдЬрд╛рдЧ , рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣, рдпрд╣рд╛рдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдпреВрдмреАрд╣реЗрд╡рд┐рдпрд░ рдореЗрдВ рдЖрднрд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред UIBehaviour рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕рд╛рд░ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧреНрд░рд╛рдлрд┐рдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╣реИред

 private ParticleSystem _particleSystem; private ParticleSystemRenderer _particleSystemRenderer; private ParticleSystem.MainModule _main; private ParticleSystem.Particle[] _particles; protected override void Awake() { base.Awake(); _particleSystem = GetComponent<ParticleSystem>(); _main = _particleSystem.main; _particleSystemRenderer = GetComponent<ParticleSystemRenderer>(); _particleSystemRenderer.enabled = false; int maxCount = _main.maxParticles; _particles = new ParticleSystem.Particle[maxCount]; } 

рдкрд╛рд░реНрдЯрд┐рдХрд▓реНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХрдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _particles рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░
_Main рдХрд╛ рдЙрдкрдпреЛрдЧ MainModule рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЪрд▓реЛ рдХрдг рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рд╕реАрдзреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд▓реЗрддреЗ рд╣реБрдП, OnPopulateMesh рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рд╕рд╣рд╛рдпрдХ рдЪрд░ рд╡реЗрдХреНрдЯрд░ 3 [] _quadCorners рдФрд░ рд╡реЗрдХреНрдЯрд░ 2 [] _simpleUV рдмрдирд╛рдПрдБ ред

_quadCorners рдореЗрдВ рдХрдг рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЖрдпрдд рдХреЗ 4 рдХреЛрдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдХрд╛рд░ рдкрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ 1x1ред
_simpleUV - uv рд╕реНрдХреИрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рдХрдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рдПрдХ рд╣реА рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 private Vector3[] _quadCorners = new Vector3[] { new Vector3(-.5f, -.5f, 0), new Vector3(-.5f, .5f, 0), new Vector3(.5f, .5f, 0), new Vector3(.5f, -.5f, 0) }; private Vector2[] _simpleUV = new Vector2[] { new Vector2(0,0), new Vector2(0,1), new Vector2(1,1), new Vector2(1,0), }; 

 protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); int particlesCount = _particleSystem.GetParticles(_particles); for (int i = 0; i < particlesCount; i++) { var particle = _particles[i]; Vector3 particlePosition = particle.position; Color vertexColor = particle.GetCurrentColor(_particleSystem) * color; Vector3 particleSize = particle.GetCurrentSize3D(_particleSystem); Vector2[] vertexUV = _simpleUV; Quaternion rotation = Quaternion.AngleAxis(particle.rotation, Vector3.forward); UIVertex[]quadVerts = new UIVertex[4]; for (int j = 0; j < 4; j++) { Vector3 cornerPosition = rotation * Vector3.Scale(particleSize, _quadCorners[j]); Vector3 vertexPosition = cornerPosition + particlePosition; vertexPosition.z = 0; quadVerts[j] = new UIVertex(); quadVerts[j].color = vertexColor; quadVerts[j].uv0 = vertexUV[j]; quadVerts[j].position = vertexPosition; } vh.AddUIVertexQuad(quadVerts); } } 

vertexPosition
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдг рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ (рдСрдкрд░реЗрд╢рди рд╡реЗрдХреНрдЯрд░ 3.Scale (particleSize, _quadCorners [j] ) рдФрд░ рд░реЛрдЯреЗрд╢рди (рдПрдХ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЪрддреБрд░реНрдзрд╛рддреБрдХ рд░реЛрдЯреЗрд╢рди рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реБрдП) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдХрдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╣реА рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдм рдЪрд▓реЛ рдорд╛рдирдХ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдпреВрдЖрдИ рдмрдирд╛рдПрдВред

рдЫрд╡рд┐

ParticleSystem рдШрдЯрдХ рдореЗрдВ рдПрдХ UIParticleSystem рдЬреЛрдбрд╝реЗрдВ

рдЫрд╡рд┐

рджреГрд╢реНрдп рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдШрдЯрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

рдЫрд╡рд┐

рдХрдгреЛрдВ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд╕реНрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рд╕реНрдХреНрд░реАрди рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдХреИрдирд╡рд╕ рдХреЗ рд░реЗрдВрдбрд░ рдореЛрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдХрдг рдХреИрдирд╡рд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╢реНрдп рдШрдЯрдХ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

SimulationSpace


рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ UI рдХреЗ рдЕрдВрджрд░ рд░рдЦрддреЗ рд╣реИрдВ, рд╕рд┐рдореБрд▓реЗрд╢рдирд╕реНрдкреЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдХрдгреЛрдВ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдг рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

 protected override void OnPopulateMesh(VertexHelper vh) { ... Vector3 particlePosition; switch (_main.simulationSpace) { case ParticleSystemSimulationSpace.World: particlePosition = _rectTransform.InverseTransformPoint(particle.position); break; case ParticleSystemSimulationSpace.Local: particlePosition = particle.position; break; case ParticleSystemSimulationSpace.Custom: if (_main.customSimulationSpace != null) particlePosition = _rectTransform.InverseTransformPoint( _main.customSimulationSpace.TransformPoint(particle.position) ); else particlePosition = particle.position; break; default: particlePosition = particle.position; break; } ... } 

ParticleSystemRenderer рдЧреБрдг рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ


рдЕрдм рд╣рдо ParticleSystemRenderer рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, RenderMode , SortMode , Pivot рдХреЗ рдЧреБрдгред

RenderMode


рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕ рддрдереНрдп рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрдг рд╣рдореЗрд╢рд╛ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╡рд┐рдорд╛рди рдореЗрдВ рд╣реА рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ: рдмрд┐рд▓рдмреЛрд░реНрдб рдФрд░ рд╕реНрдЯреНрд░реЗрдЪреНрдбрдмрд┐рд▓ ред
рдЖрдЗрдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЧрдгрдирд╛ CanvasParticleSystemRenderMode рдмрдирд╛рдПрдБред

 public enum CanvasParticleSystemRenderMode { Billboard = 0, StretchedBillboard = 1 } 

 public CanvasParticleSystemRenderMode RenderMode; public float SpeedScale = 0f; public float LengthScale = 1f; protected override void OnPopulateMesh(VertexHelper vh) { ... Quaternion rotation; switch (RenderMode) { case CanvasParticleSystemRenderMode.Billboard: rotation = Quaternion.AngleAxis(particle.rotation, Vector3.forward); break; case CanvasParticleSystemRenderMode.StretchedBillboard: rotation = Quaternion.LookRotation(Vector3.forward, particle.totalVelocity); float speed = particle.totalVelocity.magnitude; particleSize = Vector3.Scale(particleSize, new Vector3(LengthScale + speed * SpeedScale, 1f, 1f)); rotation *= Quaternion.AngleAxis(90, Vector3.forward); break; default: rotation = Quaternion.AngleAxis(particle.rotation, Vector3.forward); break; } ... } 

рдпрджрд┐ рдЖрдк StretchedBillboard рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдг рдЖрдХрд╛рд░, рд▓рдВрдмрд╛рдИ рд╕реНрдХреЗрд▓ рдФрд░ рд╕реНрдкреАрдбрд╕реНрдХреЗрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рдХрд╛ рдШреБрдорд╛рд╡ рдХреЗрд╡рд▓ рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЫрд╡рд┐

SortMode


рдЗрд╕реА рддрд░рд╣, CanvasParticlesSortMode рдПрдиреНрдпреВрдорд░реЗрд╢рди рдмрдирд╛рдПрдБред рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдХрдг рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрдБрдЯрд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 public enum CanvasParticlesSortMode { None = 0, OldestInFront = 1, YoungestInFront = 2 } 

 public CanvasParticlesSortMode SortMode; 

рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдг рдЬреАрд╡рдирдХрд╛рд▓ рдкрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЪрд░ _particleElapsedLifetime рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реЙрд░реНрдЯрд┐рдВрдЧ Array.Sort рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

 private float[] _particleElapsedLifetime; protected override void Awake() { ... _particles = new ParticleSystem.Particle[maxCount]; _particleElapsedLifetime = new float[maxCount]; } protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); int particlesCount = _particleSystem.GetParticles(_particles); for (int i = 0; i < particlesCount; i++) _particleElapsedLifetime[i] = _particles[i].startLifetime - _particles[i].remainingLifetime; switch (SortMode) { case CanvasParticlesSortMode.None: break; case CanvasParticlesSortMode.OldestInFront: Array.Sort(_particleElapsedLifetime, _particles, 0, particlesCount,Comparer<float>.Default); Array.Reverse(_particles, 0, particlesCount); break; case CanvasParticlesSortMode.YoungestInFront: Array.Sort(_particleElapsedLifetime, _particles, 0, particlesCount, Comparer<float>.Default); break; } ... } 

рдкреНрд░рдзрд╛рди рдЖрдзрд╛рд░


рдХрдг рдХреЗ рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреБрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдВред

 public Vector3 Pivot = Vector3.zero; 

рдФрд░ рдЬрдм рд╢реАрд░реНрд╖ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

 Vector3 cornerPosition = Vector3.Scale(particleSize, _quadCorners[j] + Pivot); Vector3 vertexPosition = rotation * cornerPosition + particlePosition; vertexPosition.z = 0; 

рд╕рдорд╛рдпреЛрдЬреНрдп рдЖрдХрд╛рд░


рдпрджрд┐ рд╡рд╣ рддрддреНрд╡ рдЬрд┐рд╕рд╕реЗ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ, рдЙрд╕рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рд╡реЗ рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╕реНрд░реЛрдд рдмрдирд╛рддреЗ рд╣реИрдВ - рддрддреНрд╡ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВред

рдЬрдм RectTransform рдШрдЯрдХ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ OnRectTransformDimensionsChange рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд░реЗрдХреНрдЯрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреИрдорд╛рдиреЗ рдкрд░ рдмрджрд▓рд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, RectTransform рдШрдЯрдХ рдФрд░ ShapeModule рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЪрд░ рдмрдирд╛рдПрдВред рдЖрдХрд╛рд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ScaleShapeByRectTransform рдЪрд░ рдмрдирд╛рдПрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдШрдЯрдХ рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреИрдорд╛рдиреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд╣реЛред

 private RectTransform _rectTransform; private ParticleSystem.ShapeModule _shape; public bool ScaleShapeByRectTransform; protected override void Awake() { ... _rectTransform = GetComponent<RectTransform>(); _shape = _particleSystem.shape; ... } protected override void OnEnable() { base.OnEnable(); ScaleShape(); } protected override void OnRectTransformDimensionsChange() { base.OnRectTransformDimensionsChange(); ScaleShape(); } protected void ScaleShape() { if (!ScaleShapeByRectTransform) return; Rect rect = _rectTransform.rect; var scale = Quaternion.Euler(_shape.rotation) * new Vector3(rect.width, rect.height, 0); scale = new Vector3(Mathf.Abs(scale.x), Mathf.Abs(scale.y), Mathf.Abs(scale.z)); _shape.scale = scale; } 

рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдЖрдХреГрддрд┐ рдХреЗ рд░реЛрдЯреЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдореЙрдбреБрд▓реЛ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрдгреЛрдВ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред

рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЗрдХреНрдЯрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдЪрд▓рд╛рдПрдВ ред

рдЫрд╡рд┐

рдкреНрд░рд╛рд░рдВрдн


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдирд░рдЯреЗрдХрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдордбрд┐рдореЗрдВрд╢рдирдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп , рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдЪрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕рдХреЗ рдХреЙрд▓ рдХреЛ OnPopulateMesh рдФрд░ OnRectTransformDimensionsChange рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ ред

ExecuteInEditMode
рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ ExecuteInEditMode рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 private bool _initialized; protected void Initialize() { if (_initialized) return; _initialized = true; _rectTransform = GetComponent<RectTransform>(); _particleSystem = GetComponent<ParticleSystem>(); _main = _particleSystem.main; _textureSheetAnimation = _particleSystem.textureSheetAnimation; _shape = _particleSystem.shape; _particleSystemRenderer = GetComponent<ParticleSystemRenderer>(); _particleSystemRenderer.enabled = false; _particleSystemRenderer.material = null; var maxCount = _main.maxParticles; _particles = new ParticleSystem.Particle[maxCount]; _particlesLifeProgress = new float[maxCount]; _particleRemainingLifetime = new float[maxCount]; } protected override void Awake() { base.Awake(); Initialize(); } protected override void OnPopulateMesh(VertexHelper vh) { Initialize(); ... } protected override void OnRectTransformDimensionsChange() { #if UNITY_EDITOR Initialize(); #endif ... } 

OnRectTransformDimensionsChange рд╡рд┐рдзрд┐ рдХреЛ Awake рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд░ рдХреЛ рдЖрд░рдВрдн рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЕрдиреБрдХреВрд▓рди


рдХрдгреЛрдВ рдХрд╛ рдпрд╣ рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд╛рд░реНрдЯрд┐рдХрд▓рд╕рд┐рд╕реНрдЯрдорд░реЗрдВрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдХреИрдирд╡рд╕ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЛ рдбрд░реНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкреВрд░реЗ рдХреИрдирд╡рд╕ рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рдирдИ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрдорд╛рдВрдб рдХреА рдкреАрдврд╝реА рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпреВрдЖрдИ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдИ рдПрдореНрдмреЗрдбреЗрдб рдХреИрдирд╡рд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдЫрд╡рд┐

рдкреБрдирд╢реНрдЪ: рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдбреЗрдореЛ рд▓рд┐рдВрдХ рд╣реИрдВ ред
UI рдореЗрдВ рдкрд╛рд░реНрдЯрд┐рдХрд▓рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд▓реЗрдЦ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕ рд╕рдордп, рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдп рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рдереЗред рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдХреБрдЫ рджрд┐рди рдкрд╣рд▓реЗ, рд╕рд╛рдордЧреНрд░реА рдПрдХрддреНрд░ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХрдСрди.рдкреЙрд▓реЗрдЯрдореЗрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирддрд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/hi464961/


All Articles