рдирдорд╕реНрддреЗ! рдпрд╣ рд▓реЗрдЦ
рдХреИрдирд╡рд╕ рдИ рдореЗрдВ рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдЖрдИ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЬрд╛рд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рд╕рд╛ рдпрд╛ рдЬрд╣рд╛рдВ рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрдХрддрд╛ рдХреЗ рдпреВрдЖрдИ рдХрд╛ рдЖрдзрд╛рд░
рдХреИрдирд╡рд╕ рд╣реИ ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдорд▓реНрдЯреАрд▓реЗрдпрд░" рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШрдЯрдХ рдХреЛ
рдЧреНрд░рд╛рдлрд┐рдХ рд╡рд░реНрдЧ (рдпрд╛ рдЙрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди
рдорд╛рд╕реНрдХрдмрд▓рдЧреНрд░рд╛рдлрд┐рдХ рдХреНрд▓рд╛рд╕) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдХреИрдирд╡рд╕ рд░реЗрдВрдбрд░рд░ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛
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 рдореЗрдВ рдкрд╛рд░реНрдЯрд┐рдХрд▓рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд▓реЗрдЦ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕ рд╕рдордп, рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдп рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рдереЗред рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдХреБрдЫ рджрд┐рди рдкрд╣рд▓реЗ, рд╕рд╛рдордЧреНрд░реА рдПрдХрддреНрд░ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХрдСрди.рдкреЙрд▓реЗрдЯрдореЗрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ
рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ
рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирддрд╛ рд╣реВрдВред