Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Security;
- using UnityEngine;
- public class Events : MonoBehaviour
- {
- public GameObject[] SubscribedOnAwake;
- //-- Actions list --//
- public Action OnAppStarted = delegate { };
- public Action<object> OnEggPulling = delegate { }; // float
- public Action<object> OnEggVelocity = delegate { }; // float
- public Action OnEggStartFly = delegate { };
- public Action OnEggAttached = delegate { };
- public Action OnEggEaten = delegate { };
- public Action OnEggFail = delegate { };
- //-- Subscribe --//
- private List<GameObject> m_SubscribedGameObjects = new List<GameObject>();
- //-- Reflection --//
- private List<FieldInfo> m_FieldInfoActions = new List<FieldInfo>();
- private List<FieldInfo> m_FieldInfoActionsOneParameter = new List<FieldInfo>();
- private void Awake()
- {
- FullfillFieldsInfo();
- for (int i = 0; i < SubscribedOnAwake.Length; i++)
- {
- Subscribe(SubscribedOnAwake[i]);
- }
- }
- public void Subscribe(GameObject gameObject)
- {
- if (m_SubscribedGameObjects.Contains(gameObject))
- return;
- for (int i = 0; i < m_FieldInfoActions.Count; i++)
- {
- var fieldInfo = m_FieldInfoActions[i];
- var action = (Action)fieldInfo.GetValue(this);
- AddInvoke(ref action, () => gameObject.SendMessage(fieldInfo.Name, SendMessageOptions.DontRequireReceiver));
- fieldInfo.SetValue(this, action);
- }
- for (int i = 0; i < m_FieldInfoActionsOneParameter.Count; i++)
- {
- var fieldInfo = m_FieldInfoActionsOneParameter[i];
- var action = (Action<object>)fieldInfo.GetValue(this);
- AddInvoke(ref action, (v) => gameObject.SendMessage(fieldInfo.Name, v, SendMessageOptions.DontRequireReceiver));
- fieldInfo.SetValue(this, action);
- }
- m_SubscribedGameObjects.Add(gameObject);
- }
- private void AddInvoke(ref Action action, Action invoke) => action += invoke;
- private void AddInvoke<T>(ref Action<T> action, Action<T> invoke) => action += invoke;
- private void FullfillFieldsInfo()
- {
- try
- {
- BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public;
- Type myTypeEvent = typeof(Events);
- var fields = myTypeEvent.GetFields(myBindingFlags);
- foreach (var item in fields)
- {
- if (typeof(System.MulticastDelegate) == item.FieldType.BaseType)
- {
- var value = item.GetValue(this);
- var type = value.GetType();
- var del = (System.MulticastDelegate)value;
- var delParametrsLenght = del.Method.GetParameters().Length;
- if (delParametrsLenght == 0) m_FieldInfoActions.Add(item);
- else if (delParametrsLenght == 1) m_FieldInfoActionsOneParameter.Add(item);
- }
- }
- }
- catch (SecurityException e) { Debug.LogError("SecurityException :" + e.Message); }
- catch (ArgumentNullException e) { Debug.LogError("ArgumentNullException : " + e.Message); }
- catch (Exception e) { Debug.LogError("Exception : " + e.Message); }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement