Вы также можете использовать не специфичные для Unity Action
делегаты.Мне нравится использовать статический класс для этого, но вы также можете реализовать его в одном из существующих классов (если вы используете static
члены и методы)
Например,
public static class MyEvents
{
public static event Action SomeEvent;
public static void InvokeSomeEvent()
{
// Make sure event is only invoked if someone is listening
if (SomeEvent == null) return;
SomeEvent.Invoke();
}
}
Это делает ваши классы полностью независимыми (ну, ладно, они разделяют класс MyEvents) и легко модульным.
В сценарии C
добавьте "слушатель", например
private void Start()
{
// It is save to remove a listener also if it wasn't there yet
// This makes sure you are not listening twice by accident
MyEvents.SomeEvent -= OnSomeEvent;
// Add the listener for that event
MyEvents.SomeEvent += OnSomeEvent;
}
private void OnSomeEvent ()
{
// Do something if SomeEvent is invoked
}
Затем где-нибудьв сценарии B
просто позвоните
MyEvents.InvokeSomeEvent();
Так что класс B
не должен знать или заботиться о том, кто слушает это событие;он просто вызывает его и заботится о своем собственном деле.
С другой стороны C
или (любой другой класс, в который вы добавляете прослушиватель для события) не должен знать / заботиться о том, откуда пришел вызовот;он просто обрабатывает его и выполняет свои функции.
Обратите внимание, однако, что это также усложняет отладку, поскольку уже не так просто определить, откуда взялся этот вызов;)
Примечание: Вы также можете добавить параметры в Action
, например,
public static event Action<int> SomeParameterEvent;
. В этом случае, конечно, все методы должны также реализовать этот параметр
public static InvokeSomeParameterEvent(int value)
{
if(SomeParameterAction == null) return;
SomeParameterEvent.Invoke(value);
}
In C
(слушатель) вы также должны получить параметры
// name can be changed
private void OnSomeParameterEvent(int value)
{
//...
}
И, конечно, также вызвать его с параметром в B
MyEvents.InvokeSomeParameterEvent(someInt);
И чем вы можете взять его дажедалее и вместо значения или ссылки передайте полный метод delegate
в качестве параметра.Смотрите примеры здесь