рдЗрд╡реЗрдВрдЯ рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ рдПрдЧреНрд░реАрдЧреЗрдЯрд░

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

рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛:


  1. рдХреЛрдИ рднреА рд╡рд░реНрдЧ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ (рдЕрдХреНрд╕рд░ рдПрдХ рдЗрдХрд╛рдИ рдореЗрдВ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреЗрдордмреЙрдЬрд╝ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рддреЗ рд╣реИрдВ)
  2. рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреА рджреЛрд╣рд░реА рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
  3. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╣рдЯрд╛рдиреЗ / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдЕрдирд╕рдмрд╕реНрдХреНрд░рд╛рдЗрдмрд┐рдВрдЧ рдФрд░ рдСрдЯреЛрдореИрдЯрд┐рдХ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдореЛрдиреЛрдмреЗрдХ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдореИрдВ рд╕реНрдЯреАрдо рдмрд╛рде рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдФрд░ рди рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЕрдЪрд╛рдирдХ рдЦреБрд░ рд╡рд╛рдкрд╕ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ)
  4. рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдбреЗрдЯрд╛ / рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)

рдЗрд╕реЗ рдХрд╣рд╛рдВ рд▓рдЧрд╛рдирд╛ рд╣реИ


  1. рдпрд╣ рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдЬрдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдиреЗрдХреНрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  2. рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреЛрдб рдХреЗ рдХреБрдЫ рдПрдирд╛рд▓реЙрдЧред
  3. рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
  4. рд╡реИрд╢реНрд╡рд┐рдХ рдХреЙрд▓рдмреИрдХ

рдХрдордЬреЛрд░ рдЕрдВрдХ


  1. рдореГрдд рдЧреНрд░рд╛рд╣рдХреЛрдВ рдФрд░ рдЪреЗрдХ рдкрд░ рдЪреЗрдХ рдХреЗ рдХрд╛рд░рдг (рдореИрдВ рдмрд╛рдж рдореЗрдВ рдкреНрд░рдХрдЯ рдХрд░реВрдБрдЧрд╛) рдХреЛрдб рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИ
  2. рдХреНрд▓рд╛рд╕ / рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрд╡реЗрдВрдЯ рдХреЗ рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдореЗрдореЛрд░реА + рд╢реАрд░реНрд╖ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЖрд╡рдВрдЯрди рди рд╣реЛ, рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдореЗрдВ рд╕реНрдкреИрдо рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛


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

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдИрд╡реЗрдВрдЯ рдмреЙрдбреА / рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рдШрдЯрдирд╛ рд╢рд░реАрд░ рдЙрджрд╛рд╣рд░рдг
public struct ClickOnButtonEvent   {     public int ButtonID; //     enum    } 


рдИрд╡реЗрдВрдЯ рд╕рджрд╕реНрдпрддрд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:

 public static void AddListener<T>(object listener, Action<T> action) 

рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдПрдХ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╡рд╣ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╣ рдкреНрд░рдХрд╛рд░ / рдШрдЯрдирд╛ рдЬрд┐рд╕рдХреА рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХрд╛ рдкреНрд░рдореБрдЦ рд╕рд╛рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛ рдПрдХ рдШрдЯрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реБрдирддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЬрд╛рдЧреЛ рдФрд░ OnEnable рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рджрд╕реНрдпрддрд╛;

рдЙрджрд╛рд╣рд░рдг

 public class Example : MonoBehaviour { private void Awake() { EventAggregator.AddListener<ClickOnButtonEvent>(this, ClickButtonListener); } private void ClickButtonListener(ClickOnButtonEvent obj) { Debug.Log("  " + obj.ButtonID); } } 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЪрд┐рдк рдХреНрдпрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд░рд┐рддреНрд░ рдЪрд┐рд╣реНрди рд╣реИрдВ:
  1. рдЬрд╛рдирд┐рдП рд╡реЛ рдХрд┐рд╕ рдХрд┐рд░рджрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВред
  2. рдорди, рдПрдЪрдкреА, рдНрдХреНрд╕реНрдк рдФрд░ рд╕реНрдерд┐рддрд┐ (рдЕрдЪреЗрдд, рдЕрдВрдзрд╛рдкрди, рднрдп, рдкрд╛рдЧрд▓рдкрди) рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ

рдФрд░ рдпрд╣рд╛рдВ рдЖрдк рдХрдИ рдИрд╡реЗрдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рдВрдХреЗрддрдХ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:

 public struct CharacterStateChanges { public Character Character; public float Hp; public float Mp; public float Xp; } 

рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:

 public struct CharacterNegativeStatusEvent { public Character Character; public Statuses Statuses; //enum  } 

рд╣рдо рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЪрд░рд┐рддреНрд░ рд╡рд░реНрдЧ рдХреНрдпреЛрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣рд╛рдБ рдШрдЯрдирд╛ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рд╣реИ:

 private void Awake() { EventAggregator.AddListener<CharacterNegativeStatusEvent> (this, CharacterNegativeStatusListener); } private void CharacterNegativeStatusListener(CharacterNegativeStatusEvent obj) { if (obj.Character != _character) return; _currentStatus = obj.Statuses; } 

рдпрд╣ рд╡рд╣ рдорд╛рд░реНрдХрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рд╕реАрдзреЗ рд╡рд░реНрдг рд╡рд░реНрдЧ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓реЗрддреЗ? рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреИрдо рдХрд░реЗрдВ?
рдкрджрд╛рд░реНрдкрдг рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛, рд╡рд░реНрдЧреЛрдВ / рдЖрдпреЛрдЬрдиреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдЕрдкрдирд╛ рдЕрд▓рдЧ рдЖрдпреЛрдЬрди рдХрд░реЗрдВред

рдХреНрдпреЛрдВ, рдлрд┐рд░ рд╕реЗ, рдШрдЯрдирд╛ рдХреЗ рдЕрдВрджрд░, рдмрд╕ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рд╕рдм рдХреБрдЫ рд▓реЗрддреЗ рд╣реИрдВ?
рддреЛ рд╡реИрд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд░реНрдЧ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднрд╛рд░реА рд╣реИ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рдорд╛рд░реНрдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ; рдЕрджреНрдпрддрди рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрд▓реНрдХрд┐ рджреБрд░реНрд▓рдн рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рдХреЛ рдПрдХ рдШрдЯрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ / рджреГрд╢реНрдп рдореЙрдбрд▓, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ 1 рд╡рд░реНрдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдХ рджрд╛рд╡реЗрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ рд╣реИ - рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрдИрдбреА (рдЗрдирдо рд╕реЗ, рдЬрдЯрд┐рд▓ рд╣реИрд╢, рдЖрджрд┐)ред

рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рд╕реАрдзреЗ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреЛрдб
 namespace GlobalEventAggregator public delegate void EventHandler<T>(T e); { public class EventContainer<T> : IDebugable { private event EventHandler<T> _eventKeeper; private readonly Dictionary<WeakReference, EventHandler<T>> _activeListenersOfThisType = new Dictionary<WeakReference, EventHandler<T>>(); private const string Error = "null"; public bool HasDuplicates(object listener) { return _activeListenersOfThisType.Keys.Any(k => k.Target == listener); } public void AddToEvent(object listener, EventHandler<T> action) { var newAction = new WeakReference(listener); _activeListenersOfThisType.Add(newAction, action); _eventKeeper += _activeListenersOfThisType[newAction]; } public void RemoveFromEvent(object listener) { var currentEvent = _activeListenersOfThisType.Keys.FirstOrDefault(k => k.Target == listener); if (currentEvent != null) { _eventKeeper -= _activeListenersOfThisType[currentEvent]; _activeListenersOfThisType.Remove(currentEvent); } } public EventContainer(object listener, EventHandler<T> action) { _eventKeeper += action; _activeListenersOfThisType.Add(new WeakReference(listener), action); } public void Invoke(T t) { if (_activeListenersOfThisType.Keys.Any(k => k.Target.ToString() == Error)) { var failObjList = _activeListenersOfThisType.Keys.Where(k => k.Target.ToString() == Error).ToList(); foreach (var fail in failObjList) { _eventKeeper -= _activeListenersOfThisType[fail]; _activeListenersOfThisType.Remove(fail); } } if (_eventKeeper != null) _eventKeeper(t); return; } public string DebugInfo() { string info = string.Empty; foreach (var c in _activeListenersOfThisType.Keys) { info += c.Target.ToString() + "\n"; } return info; } } public static class EventAggregator { private static Dictionary<Type, object> GlobalListeners = new Dictionary<Type, object>(); static EventAggregator() { SceneManager.sceneUnloaded += ClearGlobalListeners; } private static void ClearGlobalListeners(Scene scene) { GlobalListeners.Clear(); } public static void AddListener<T>(object listener, Action<T> action) { var key = typeof(T); EventHandler<T> handler = new EventHandler<T>(action); if (GlobalListeners.ContainsKey(key)) { var lr = (EventContainer<T>)GlobalListeners[key]; if (lr.HasDuplicates(listener)) return; lr.AddToEvent(listener, handler); return; } GlobalListeners.Add(key, new EventContainer<T>(listener, handler)); } public static void Invoke<T>(T data) { var key = typeof(T); if (!GlobalListeners.ContainsKey(key)) return; var eventContainer = (EventContainer<T>)GlobalListeners[key]; eventContainer.Invoke(data); } public static void RemoveListener<T>(object listener) { var key = typeof(T); if (GlobalListeners.ContainsKey(key)) { var eventContainer = (EventContainer<T>)GlobalListeners[key]; eventContainer.RemoveFromEvent(listener); } } public static string DebugInfo() { string info = string.Empty; foreach (var listener in GlobalListeners) { info += "     " + listener.Key.ToString() + "\n"; var t = (IDebugable)listener.Value; info += t.DebugInfo() + "\n"; } return info; } } public interface IDebugable { string DebugInfo(); } } 


рдЪрд▓реЛ рдореБрдЦреНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рдпрд╣ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рдЯрд╛рдЗрдк рд╣реИ рдФрд░ рдореВрд▓реНрдп рдХрдВрдЯреЗрдирд░ рд╣реИ

 public class EventContainer<T> : IDebugable 

 private static Dictionary<Type, object> GlobalListeners = new Dictionary<Type, object>(); 

рд╣рдо рдХрдВрдЯреЗрдирд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ? рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдВрдЬреА рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬрд▓реНрджреА рд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?

 private event EventHandler<T> _eventKeeper; private readonly Dictionary<WeakReference, EventHandler<T>> _activeListenersOfThisType = new Dictionary<WeakReference, EventHandler<T>>(); 

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

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

рдЙрдкрдпреЛрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдЬрд╛рдЧреГрдд рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ / рдмрдВрдж рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рдЬрд╛рдЧ рдФрд░ рдСрдирдПрдиреЗрдмрд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдпрд╣ рджреЛ рдмрд╛рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдореГрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЧреЗрдо рдСрдмрдЬреЗрдХреНрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЪрд╛рд▓рд╛рди рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЬрдм рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдВрдЧреЗред

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

рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рд╣реИ - рдкрдмреНрд▓рд┐рдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреАрдмрдЧрдЗрдиреНрдлреЛ (), рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдХреНрд▓рд╛рд╕ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЧрд┐рдЯрд╣рдм рднрдВрдбрд╛рд░

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


All Articles