我在Unity中使用委托和事件时遇到了麻烦。我熟悉订阅和取消订阅。
我的问题是堆栈溢出异常。但是,即使在播放模式下,我的控制台也会输出另一条消息。我相信此日志与stackoverflow异常相关,因为它是同时发生的。 同样令人好奇的是,错误刚刚开始发生,而我却没有接触过这段代码。订阅活动我没有做任何改变。 请注意,我之前在另一个项目中也遇到了同样的问题,最终放弃了事件订阅。
请注意,我不是在谈论UnityEvent。我说的是脚本委托和事件。
这是委托和事件代码的定义:
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,但这似乎无法解决任何问题。
答案 0 :(得分:1)
您必须退订,否则会泄漏内存。建议订阅OnEnable()
,然后退订OnDisable()
。