using System.Collections.Generic; namespace Invector { [vClassHeader("MESSAGE RECEIVER", "Use this component with the vMessageSender to call Events.")] public class vMessageReceiver : vMonoBehaviour { public static event OnReceiveMessage onReceiveGlobalMessage; public List messagesListeners; [System.Serializable] public delegate void OnReceiveMessage(string name, string message = null); [System.Serializable] public class OnReceiveMessageEvent : UnityEngine.Events.UnityEvent { } public event OnReceiveMessage onReceiveMessage; private void Start() { for (int i = 0; i < messagesListeners.Count; i++) { vMessageListener messageListener = messagesListeners[i]; if (messageListener.receiveFromGlobal) { onReceiveGlobalMessage -= messageListener.OnReceiveMessage; onReceiveGlobalMessage += messageListener.OnReceiveMessage; } else { onReceiveMessage -= messageListener.OnReceiveMessage; onReceiveMessage += messageListener.OnReceiveMessage; } } } [System.Serializable] public class vMessageListener { public string Name; public bool receiveFromGlobal; public OnReceiveMessageEvent onReceiveMessage; public void OnReceiveMessage(string name, string message = null) { if (Name.Equals(name)) onReceiveMessage.Invoke(string.IsNullOrEmpty(message) ? string.Empty : message); } public vMessageListener(string name) { this.Name = name; } public vMessageListener(string name, UnityEngine.Events.UnityAction listener) { this.Name = name; this.onReceiveMessage.AddListener(listener); } } /// /// Add Action Listener /// /// Message Name /// Action Listener public void AddListener(string name, UnityEngine.Events.UnityAction listener) { if (messagesListeners.Exists(l => l.Name.Equals(name))) { var messageListener = messagesListeners.Find(l => l.Name.Equals(name)); messageListener.onReceiveMessage.AddListener(listener); } else { messagesListeners.Add(new vMessageListener(name, listener)); } } /// /// Remove Action Listener /// /// Message Name /// Action Listener public void RemoveListener(string name, UnityEngine.Events.UnityAction listener) { if (messagesListeners.Exists(l => l.Name.Equals(name))) { var messageListener = messagesListeners.Find(l => l.Name.Equals(name)); messageListener.onReceiveMessage.RemoveListener(listener); } } /// /// Call Action without message /// /// message name public void Send(string name) { if (this.enabled == false) return; onReceiveMessage?.Invoke(name, string.Empty); } /// /// Call Action with message /// /// message name /// message value public void Send(string name, string message) { if (this.enabled == false) return; onReceiveMessage?.Invoke(name, message); } public static void SendGlobal(string name, string message = null) { onReceiveGlobalMessage?.Invoke(name, message); } } }