c# - 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 ,但这似乎没有解决任何问题。
解决方案
您必须取消订阅,否则您将泄漏内存。建议订阅OnEnable()
和取消订阅OnDisable()
。
推荐阅读
- loops - 在迭代地图的同时修改地图时如何使用 RWMutex
- azure-data-explorer - 如何通过 kusto (Azure Data Exploer) 获取每个表的不同计数
- visual-studio - 当我使用另一个程序(例如 Windows Calculator)时,Visual Studio 调试器中显示的 CPU 寄存器值为什么不会改变
- reactjs - 在 React 应用程序上的每个图像上都出现损坏的图像图标
- sql - SQL 改变位置
- fullcalendar - 如何在 Fullcalendar 的时间线视图中在所有源上呈现一个事件?
- javascript - 从存储为 JS 变量的表单中获取目标值
- python - python中非定常二维热方程的数值解不正确地产生错误
- flutter - 在 Flutter 中查询后如何更新 Firestore 文档
- angular - NestJs 在不同文件夹中编译 Angular 应用程序