рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рд╢реМрдХрд┐рдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдПрдХрддрд╛ рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рдЗрдХрд╛рдИ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдореЗрд░реА рдмрд╛рдЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреЗрдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдерд╛ред
рдореЗрд░рд╛ рдХрд╛рдо рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдмрд╣реБрдд рд╣реА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред
рдирддреАрдЬрддрди, рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдЪрд░рд╛ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдХреВрдбрд╝реЗ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЙрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ GetComponent () рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдХреЙрд▓ред
рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЛ рдЧреЗрдордСрдмрдЬреЗрдХреНрдЯ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдШрдЯрдирд╛рдУрдВ рдХреА рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛: рд╡рд┐рд╖рдп рдФрд░ рдШрдЯрдирд╛ рд╡рд╕реНрддреБ:
[System.Serializable] public class Event : UnityEvent<GameObject, GameObject> {}
рдореИрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдИрд╡реЗрдВрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ:
public enum EventTypes { TargetLock, TargetLost, TargetInRange, TargetOutOfRange, Attack, }
рдЗрди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рддреБрдЪреНрдЫ рд╣реИред public class EventManager : MonoBehaviour { Dictionary<EventTypes, Event> events; static EventManager eventManager; public static EventManager Instance { get { if (!eventManager) { eventManager = FindObjectOfType(typeof(EventManager)) as EventManager; if (!eventManager) { print("no event manager"); } else { eventManager.Init(); } } return eventManager; } } void Init() { if (events == null) { events = new Dictionary<EventTypes, Event>(); } } public static void StartListening(EventTypes eventType, UnityAction<GameObject, GameObject> listener) { if (Instance.events.TryGetValue(eventType, out Event thisEvent)) { thisEvent.AddListener(listener); } else { thisEvent = new Event(); thisEvent.AddListener(listener); Instance.events.Add(eventType, thisEvent); } } public static void StopListening(EventTypes eventType, UnityAction<GameObject, GameObject> listener) { if (eventManager == null) return; if (Instance.events.TryGetValue(eventType, out Event thisEvent)) { thisEvent.RemoveListener(listener); } } public static void TriggerEvent(EventTypes eventType, GameObject obj1, GameObject obj2) { if (Instance.events.TryGetValue(eventType, out Event thisEvent)) { thisEvent.Invoke(obj1, obj2); } } }
рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╡реЗрдВрдЯреНрд╕ рдШрдЯрдХ рдмрдирд╛рдпрд╛, рдЬреЛ рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдЗрд╕рдореЗрдВ, рдореИрдВ рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ-рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗ рдмрдирд╛рддрд╛ рд╣реВрдВред
public class Events : MonoBehaviour { Dictionary<EventTypes, UnityAction<GameObject, GameObject>> eventHandlers; void HandlersInit() { eventHandlers = new Dictionary<EventTypes, UnityAction<GameObject, GameObject>> { { EventTypes.TargetLock, TargetLock }, { EventTypes.TargetLost, TargetLost }, { EventTypes.TargetInRange, TargetInRange }, { EventTypes.TargetOutOfRange, TargetOutOfRange }, { EventTypes.Attack, Attack }, }; } }
рдирддреАрдЬрддрди, рдлрд╝рд╛рдЗрд▓ рдмреЛрдЭрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣реИ - рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдПред
рдореИрдВ рдЗрд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛рдУрдВ рдкрд░ рдФрд░ рдмрдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рднреА рдЧреЗрдо рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдореИрдВ рдордХреНрдЦреА рдкрд░ рдХреБрдЫ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ:
void OnEnable() { foreach (KeyValuePair<EventTypes, UnityAction<GameObject, GameObject>> pair in eventHandlers) StartListening(pair.Key, pair.Value); } void OnDisable() { foreach (KeyValuePair<EventTypes, UnityAction<GameObject, GameObject>> pair in eventHandlers) StopListening(pair.Key, pair.Value); }
рдЕрдм рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕ рд╡рд╕реНрддреБ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ gameObject рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдЪрд░рд┐рддреНрд░ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдмрди рдЬрд╛рдПрдЧрд╛! = Null:
Monster _mob; Character _char; void ComponentsInit() { _mob = GetComponent<Monster>(); _char = GetComponent<Character>(); }
рдпрд╣ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЕрд╡реЗрдХ () рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдм рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
void TargetLock(GameObject g1, GameObject g2) { if (_char) _char.TargetLock(g1, g2); if (_mob) _mob.TargetLock(g1, g2); }
рдкрд░рд┐рдгрд╛рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕реВрдЪреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдИрд╡реЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рдЪрд░рд┐рддреНрд░ рдпрд╛ рд░рд╛рдХреНрд╖рд╕ рдШрдЯрдХреЛрдВ рдХреЗ рдЕрдВрджрд░, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ:
public virtual void TargetLock(GameObject g1, GameObject g2) { if (g1 == gameObject) target = g2; if (g2 == gameObject) TargetedBy(g1); }
рдЙрд╕реА рд╕рдордп, рдореБрдЭреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рдХреНрд░реЙрд╕-рд░реЗрдлрд░реЗрдВрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рднреА рдирдИ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ "рдкреНрд░рд╛рдердорд┐рдХ" рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдПрдХ рдЬрдЧрд╣ рдкрд░ рд░рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдЕрдВрддрд┐рдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╡реЗ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рд┐рдПред
рдЕрдм рддрдХ, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ: рд╕рд┐рд╕реНрдЯрдо "рдЕрдкреВрд░реНрдг" 100 + рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд░реНрдЬрдиреЛрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдордп-рд╕рдВрд╡реЗрджреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рддреАрд░ рд╕реЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рд╕реЗ рдиреБрдХрд╕рд╛рди рдЙрдард╛рдирд╛ред