У меня были проблемы с использованием делегатов и событий в Unity.Я знаком с подпиской и отпиской.
У меня проблема с исключением переполнения стека.Однако моя консоль выводит другое сообщение, даже не находясь в режиме воспроизведения.Я уверен, что этот журнал привязан к исключению stackoverflow, потому что это произошло одновременно.Что также любопытно, так это то, что ошибка только начинала происходить, и я некоторое время не касался этой части кода.Я ничего не изменил в подписке на событие.Обратите внимание, что у меня была точно такая же проблема ранее в другом проекте, и в итоге я отказался от подписки на события.
Обратите внимание, я не говорю о UnityEvent.Я говорю о скрипте делегата и события.
![Here is a screenshot of the error i am getting while the game is not running.](https://i.stack.imgur.com/P9KlJ.png)
Вот определение делегата и код события:
public delegate void gameStart();
public event gameStart OnGameStart;
public delegate void gameEnd();
public event gameEnd OnGameEnd;
Вот подписчик:
public override void OnInitialize()
{
GameManager.Instance.OnGameEnd += StopSound;
GameManager.Instance.OnGameStart += PlaySwipeClip;
}
public void PlaySound(AudioClip clip, bool doNotStopCurrent = false)
{
if (doNotStopCurrent)
{
popupAudioSource.clip = clip;
popupAudioSource.Play();
// AudioSource.PlayClipAtPoint(clip, Vector3.zero, 1f);
}
else
{
mainAudioSource.clip = clip;
mainAudioSource.Play();
}
}
public void PlaySwipeClip()
{
mainAudioSource.clip = SwipeClip;
mainAudioSource.Play();
}
Я подписываюсь на события только один раз (я использую шаблон синглтона, OnInitialize()
вызывается в Awake()
).Я уверен, что подписка не происходит дважды.
Я никогда не отписываюсь от событий.Причина этого в том, что я использую одну и ту же сцену и объекты «Менеджер» для всего жизненного цикла приложения.Есть что-то, чего я здесь не хватает?Должен ли я отказаться от подписки в OnDestroy?
Почему-то у меня такое чувство, что подписки сохраняются между жизненными циклами.Ошибка исчезает на некоторое время, когда я переименовываю переменную события.
Также я попытался явно установить все события в null в методе пробуждения, однако, похоже, это ничего не решает.