Ich arbeite an einem kleinen Unity-Projekt mit C#.Wie abonniere ich Ereignisse, die in mehreren Instanzen einer Klasse ausgelöst wurden?
Ich habe eine Klasse UnitManager
, die eine Liste der Instanzen der Klasse Unit
enthält. Ich möchte ein Ereignis auslösen, wenn sich eine Eigenschaft (z. B. Gesundheit) innerhalb einer Instanz von Unit
ändert. Ich verwende auch die UnitManager
, um die eventHandlers zu speichern. Zum Beispiel habe ich einen UI-Manager, der das Ereignis in der UnitManager
abonniert.
Das Problem, das ich habe, ist, dass ich nicht wollen, dass die Unit
Klasse über die UnitManager
Klasse. Der Code, den ich gerade habe (unten) funktioniert, aber ich denke, das würde als gekoppelten Code betrachtet werden?
public class Unit
{
private int health;
public int Health {
get { return health; }
set
{
health = value;
UnitManager.Instance.OnHealthChanged(this); //Unit shouldn't call UnitManager, right?
}
}
}
public class UnitManager
{
protected List<Unit> units = new List<Unit>();
public delegate void UnitHealthChangedEventHandler(object source, UnitEventArgs args);
public event UnitHealthChangedEventHandler HealthChanged;
public virtual void OnHealthChanged(Unit _unit)
{
if (HealthChanged != null)
{
HealthChanged(this, new UnitEventArgs() { unit = _unit });
}
}
}
public class UIManager
{
void Start()
{
UnitManager.Instance.HealthChanged += OnUnitHealthChanged;
}
}
Nach einem MSDN sample sollte der Ereignis-Handler in das Unit
(das Ereignisse Sender) gespeichert werden. Der Unterschied ist, dass das Beispiel auf MSDN nur eine Instanz von "Counter" hat, aber mein Code hat mehrere Instanzen. Dies würde bedeuten, dass ich alle Instanzen der Einheit durchlaufen muss und sie dann abonnieren muss. Ich fürchte, das würde ein Performance-Problem werden. (Vor allem, da ich an mehreren Stellen in meinem Code das gleiche Problem habe)
Auf meine Frage zusammenfassen: was den besten Weg ist (in Bezug auf OOP/lose Kopplung) ein Eventhandler Griff Ereignisse zu lassen, die in mehreren Instanzen einer Klasse angehoben?
Vielen Dank für Ihre Antworten und Blogpost. Es hat einige Zeit gedauert, bis ich herausgefunden habe, wie ich das umsetzen kann. Der EventBus war wirklich das, was ich gesucht habe. Kannst du eines klarstellen: Ist ein EventBus wie ein Event-Aggregator? – milosa
Ja - ich musste nachsehen, aber es ist eine andere Bezeichnung für die gleiche Sache. –
Ich bin an allem interessiert, was ich tun kann, um es einfacher zu verwenden und zu verstehen. Vielen Dank –