Unity中的代表/事件出现问题

时间:2018-09-21 17:31:23

标签: c# unity3d events

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

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

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

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

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

view.getContext()

这里是订户:

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())。 我很肯定订阅不会发生两次。

我从不退订事件。原因是我在整个应用程序的生命周期中使用了相同的场景和“ Manager”对象。 我在这里缺少什么吗?我应该取消订阅OnDestroy吗?

以某种方式,我觉得订阅在生命周期之间是持久的。重命名事件变量后,错误消失了一段时间。

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

1 个答案:

答案 0 :(得分:1)

您必须退订,否则会泄漏内存。建议订阅OnEnable(),然后退订OnDisable()