Событие (делегаты) — в чем опасность чрезмерной зависимости от них?

#c# #unity3d #events #delegates

#c# #unity3d #Мероприятия #делегаты

Вопрос:

 public delegate void Event_GameStart();
public static event Event_GameStart OnGameStart;

public delegate void Event_RunningStart();
public static event Event_RunningStart OnRunningStart;

public delegate void Event_PassiveSpeedIncrease();
public static event Event_PassiveSpeedIncrease OnSpeedIncrease;  

public static void Call_GameStarts ()
{
    OnGameStart?.Invoke();
}

public static void Call_RunningStarts()
{
    OnRunningStart?.Invoke();
}

public static void Call_SpeedIncrease()
{
    OnSpeedIncrease?.Invoke();
}
  

Я люблю события Unity, потому что мне не нужно, чтобы каждый объект ссылался на ParticleEffectManager, SfxManager, HUDManager и т.д. для каждого взаимодействия, которое происходит, я могу отделить так много вещей.

Но когда я смотрю на этот SceneEventsManager.cs, который становится все больше и больше, и я вижу, что в этом одном сценарии есть 20, даже 100 событий, я начинаю задаваться вопросом, не слишком ли это зависит от событий. Могут ли какие-либо опытные программисты рассказать мне об опасности, с которой я это делаю, и если есть лучшая альтернатива?

Комментарии:

1. События — это функция C #, а не функция Unity. Единственный недостаток, о котором я знаю, это то, что это занимает незначительно больше времени, чем виртуальные методы.

2. Я думаю, что главная опасность здесь уже заключается в наличии static вещи, которая, по-видимому, контролирует все .. вместо этого вам лучше использовать правильные ссылки… и да, как упоминалось выше: event и delegate являются общими c# ключевыми словами, а не специфичными для Unity… UnityEvent существует как тип, и поэтому ваш заголовок и описание немного вводят в заблуждение…

3. то, что вы создаете, является довольно спорной вещью.. да, вы «разъединяете» вещи, поскольку вам не нужна ссылка… но действительно ли? Нет, на самом деле вы хорошо связываете все вместе со сложной системой событий скрытым образом! Позже может стать довольно сложно понять, в каком порядке вызываются вещи или что на самом деле вызывается кем и кто будет слушать

4. @derHugo Да, похоже, что все сценарии проходят через этот один хаб, никто не знает, кто проходит и в каком порядке, все, что мы знаем, это то, что если это испортит все, произойдет сбой! XD

5. @SirMt точно 😉 Еще одна ошибка с событиями в Unity, в частности с static ones: вы должны быть очень осторожны, чтобы отменить регистрацию любого прослушивателя для объекта перед его уничтожением, иначе вы получаете исключения каждый раз, когда вызывается событие