Я еще не до конца понял вопрос и не вижу, где вы подписываете обратные вызовы к событиям.
Интересно, сколько делегатов я могу создать
& RightArrow; Столько, сколько вам нравится! Вопрос в том, нужен ли ты и хочешь?
Если вы хотите добавить несколько обратных вызовов к одному событию (так звучит заголовок), вы просто используете +=
вместо =
public class Example : MonoBehaviour
{
private void Awake()
{
// Note: It is always save to remove callbacks
// even if not added yet.
// This makes sure they are added only once for this instance
OnCommunication -= OnServerCommunication;
OnSceneSync -= OnServerSceneSync;
OnCommunication += OnServerCommunication;
OnSceneSync += OnServerSceneSync;
}
privtae void OnDestroy()
{
// Make sure to always remove callbacks when not needed anymore
OnCommunication -= OnServerCommunication;
OnSceneSync -= OnServerSceneSync;
}
private void OnServerCommunication()
{
Debug.Log("Communication was invoked", this);
}
private void OnServerSceneSync()
{
Debug.Log("Scene sync was invoked", this);
}
}
Если ваш вопрос скорее похож на «Я хочу добавить несколько обратных вызовов, но всегда выполнять только один из них». Я бы посоветовал вообще не использовать event
s, а что-то вроде
public interface IServerCommunicationHandler
{
void OnServerCommunication();
}
public interface IServerSceneSyncHandler
{
void OnServerSceneSync();
}
А в хранилище сервера слушатели вроде
public class Server : MonoBehaviour
{
private static readonly List<IServerCommunicationHandler> CommunicationListeners = new List<IServerCommunicationHandler>();
private static readonly List<IServerSceneSyncHandler> SceneSyncListeners = new List<IServerSceneSyncHandler>();
public static void AddCommunicationListener(IServerCommunicationHandler listener)
{
if (!CommunicationListeners.Contains(listener)) CommunicationListeners.Add(listener);
}
public static void RemoveCommunicationListener(IServerCommunicationHandler listener)
{
if (CommunicationListeners.Contains(listener)) CommunicationListeners.Remove(listener);
}
public static void AddSceneSyncListener(IServerSceneSyncHandler listener)
{
if (!SceneSyncListeners.Contains(listener)) SceneSyncListeners.Add(listener);
}
public static void RemoveSceneSyncListener(IServerSceneSyncHandler listener)
{
if (SceneSyncListeners.Contains(listener)) SceneSyncListeners.Remove(listener);
}
}
и чем вместо OnCommunication?Invoke()
и OnSceneSync?.Invoke()
есть, например,
private void InvokeCommunication()
{
var listener = CommunicationListeners.Count > 0 ? CommunicationListeners[0] : null;
if (listener == null) return;
listener.OnServerCommunication();
CommunicationListeners.RemoveAt(0);
}
private void InvokeSceneSync()
{
var listener = SceneSyncListeners.Count > 0 ? SceneSyncListeners[0] : null;
if (listener == null) return;
listener.OnServerSceneSync();
SceneSyncListeners.RemoveAt(0);
}
Тогда сценарии могут выглядеть, например,
public class Example : MonoBehaviour, IServerCommunicationHandler, IServerSceneSyncHandler
{
private void Awake()
{
Server.AddCommunicationListener(this);
Server.AddSceneSyncListener(this);
}
private void OnDestroy()
{
Server.RemoveCommunicationListener(this);
Server.RemoveSceneSyncListener(this);
}
public void OnSeverCommunication()
{
Debug.Log("Communication was invoked", this);
}
public void OnServerSceneSync()
{
Debug.Log("Scene sync was invoked", this);
}
}