Беда с делегатами / событиями в Unity - PullRequest
0 голосов
/ 21 сентября 2018

У меня были проблемы с использованием делегатов и событий в Unity.Я знаком с подпиской и отпиской.

У меня проблема с исключением переполнения стека.Однако моя консоль выводит другое сообщение, даже не находясь в режиме воспроизведения.Я уверен, что этот журнал привязан к исключению stackoverflow, потому что это произошло одновременно.Что также любопытно, так это то, что ошибка только начинала происходить, и я некоторое время не касался этой части кода.Я ничего не изменил в подписке на событие.Обратите внимание, что у меня была точно такая же проблема ранее в другом проекте, и в итоге я отказался от подписки на события.

Обратите внимание, я не говорю о UnityEvent.Я говорю о скрипте делегата и события.

Here is a screenshot of the error i am getting while the game is not running.

Вот определение делегата и код события:

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 в методе пробуждения, однако, похоже, это ничего не решает.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы должны отказаться от подписки, иначе у вас будет утечка памяти.Рекомендуется подписаться OnEnable() и отписаться OnDisable().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...