Files
beyond/Assets/ThirdParty/Invector-3rdPersonController/Basic Locomotion/Scripts/Generic/Utils/vMessageReceiver.cs

114 lines
4.1 KiB
C#

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<vMessageListener> messagesListeners;
[System.Serializable]
public delegate void OnReceiveMessage(string name, string message = null);
[System.Serializable]
public class OnReceiveMessageEvent : UnityEngine.Events.UnityEvent<string> { }
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<string> listener)
{
this.Name = name;
this.onReceiveMessage.AddListener(listener);
}
}
/// <summary>
/// Add Action Listener
/// </summary>
/// <param name="name">Message Name</param>
/// <param name="listener">Action Listener</param>
public void AddListener(string name, UnityEngine.Events.UnityAction<string> 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));
}
}
/// <summary>
/// Remove Action Listener
/// </summary>
/// <param name="name">Message Name</param>
/// <param name="listener">Action Listener</param>
public void RemoveListener(string name, UnityEngine.Events.UnityAction<string> listener)
{
if (messagesListeners.Exists(l => l.Name.Equals(name)))
{
var messageListener = messagesListeners.Find(l => l.Name.Equals(name));
messageListener.onReceiveMessage.RemoveListener(listener);
}
}
/// <summary>
/// Call Action without message
/// </summary>
/// <param name="name">message name</param>
public void Send(string name)
{
if (this.enabled == false) return;
onReceiveMessage?.Invoke(name, string.Empty);
}
/// <summary>
/// Call Action with message
/// </summary>
/// <param name="name">message name</param>
/// <param name="message">message value</param>
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);
}
}
}