我在 OnEnable 中注册事件并在 OnDisable 中取消注册它们。在大多数情况下它可以工作,但我有一个简单的脚本,当我加载新场景并通过按下按钮调用事件时,它会导致
MissingReferenceException: The object of type 'GraphicsSwitch' has been destroyed but you are still trying to access it.
。
当我检查 Debug.Log 时,我知道 OnDisable 被调用。在我按下新场景中的按钮之前,不会在新场景中调用该事件。
添加
if (this != null)
后,错误消失了。检查 gameObject 是否为 null 不起作用。看来该事件并未取消订阅,并且该方法是在前一个场景中被销毁的对象上调用的。
代码很简单:
private void OnEnable()
{
AdjustGraphics();
GameSettings.GraphicsChanged += AdjustGraphics;
}
private void OnDisable()
{
GameSettings.GraphicsChanged -= AdjustGraphics;
}
private void AdjustGraphics()
{
//without this line I get the error
if (this != null)
gameObject.SetActive(GameSettings.Graphics >= requiredQuality);
}
AdjustGraphics 方法不应在新加载的场景中调用。我认为应该立即取消订阅这些对象。 在取消订阅事件时我是否缺少某些东西?
我知道 Unity 中的对象不会立即被销毁,但是 OnDisable 会按时调用,因此当加载新场景时,我的脚本/对象不应再监听 GameSettings.GraphicsChanged 事件。
此链接对我有帮助:
https://forum.unity.com/threads/how-to-remove-and-inputaction-phase-callback.894601/
private void doSomething(CallbackContext ctx)
{
// do the thing
}
//register
action.started += doSomething;
//unregsiter
action.started -= doSomething;
你解决这个问题了吗?当我重新加载场景并再次订阅一个事件时,我遇到了同样的问题。当事件调用时,会调用该对象的“null”幽灵
如果我错了,请纠正我,但是当您加载新场景时,您的对象将被销毁,因此
MissingReferenceException
除非您使用 DontDestroyOnLoad。
如果您不想使用它,请确保在场景加载开始时初始化该对象,即在调用其任何函数之前确保您的对象存在于场景中。