取消订阅 OnDisable 事件时出现问题

问题描述 投票:0回答:3

我在 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 事件。

c# unity-game-engine events
3个回答
0
投票

此链接对我有帮助:

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;

0
投票

你解决这个问题了吗?当我重新加载场景并再次订阅一个事件时,我遇到了同样的问题。当事件调用时,会调用该对象的“null”幽灵


-1
投票

如果我错了,请纠正我,但是当您加载新场景时,您的对象将被销毁,因此

MissingReferenceException
除非您使用 DontDestroyOnLoad

如果您不想使用它,请确保在场景加载开始时初始化该对象,即在调用其任何函数之前确保您的对象存在于场景中。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.