首页 > 解决方案 > Unity 中代表/事件的问题

问题描述

我在 Unity 中使用委托和事件时遇到了麻烦。我熟悉订阅和退订。

我遇到的问题是堆栈溢出异常。但是,我的控制台即使不在播放模式下也会输出另一条消息。我相信这个日志与 stackoverflow 异常有关,因为它同时发生。同样令人好奇的是,错误刚刚开始发生,而我暂时没有触及那部分代码。我在订阅事件时没有改变任何东西。请注意,我早些时候在另一个项目中遇到了同样的问题,最终放弃了事件订阅。

请注意,我不是在谈论 UnityEvent。我说的是脚本委托和事件。

这是我在游戏未运行时遇到的错误的屏幕截图。

这是委托和事件代码的定义:

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 吗?

不知何故,我有一种感觉,订阅在生命周期之间是持久的。当我重命名事件变量时,错误消失了一段时间。

我还尝试在 awake 方法中将所有事件显式设置为 null ,但这似乎没有解决任何问题。

标签: c#unity3devents

解决方案


您必须取消订阅,否则您将泄漏内存。建议订阅OnEnable()和取消订阅OnDisable()


推荐阅读