我怎么能修复MissingReferenceException,它告诉我游戏对象在我没有销毁的时候被破坏了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎么能修复MissingReferenceException,它告诉我游戏对象在我没有销毁的时候被破坏了?相关的知识,希望对你有一定的参考价值。

我的代码看起来像这样。

public static Dictionary<int, Action> functionsMap;
void Function()
{
    if (!isDictionaryInitialized)
    {
        functionsMap = new Dictionary<int, Action>();

        functionsMap.Add(1, () => StartCoroutine(Function1()));
        functionsMap.Add(1, () => StartCoroutine(Function2()));
    }
 }

void CheckForFunction()
{
    var r = currentFunctionNumber;

    if (functionsMap.TryGetValue(r, out currentAction)) { currentAction(); }
}

当我启动程序时,代码工作正常。但是,如果我去另一个场景然后返回它,我会收到此错误。

“MissingReferenceException:'ScriptName'类型的对象已被破坏,但您仍在尝试访问它。您的脚本应该检查它是否为null或者您不应该销毁该对象。”

问题是我从来没有销毁过这个对象。最初我没有bool isDictionaryInitialized,我在函数之外定义了新的Dictionary因为我认为错误与我的程序试图访问在场景关闭后删除的Dictionary有关。无论有没有bool,我都会遇到同样的问题,无论我在哪里定义Dictionary.

造成这种情况的原因是什么,以及我可以避免犯同样错误的原因是什么?

编辑:这个问题被标记为重复,但我不相信的链接适用于我的情况,或者如果它确实我不明白如何。它表示静态对象不会在场景更改时重新加载,并且Dictionary被定义为静态对象。我也尝试将其更改为非静态,结果是一样的。

我的代码中有几十个游戏对象,并没有任何其他对象的这个问题,所以我认为问题与字典对象的定义方式有关。有没有办法防止Dictionary对象在场景变化时被破坏?我没有将它作为场景中的游戏对象,它只是在代码本身中定义为公共静态字典。有人可以告诉我我需要做些什么不同请,谢谢你?

答案

问题可能是由于更改场景造成的,因为只是加载另一个场景会破坏当前场景中的所有游戏对象。

根据Object.DontDestroyOnLoad

新场景的加载会破坏所有当前场景对象。

要解决此问题,您可以使用DontDestroyOnLoad函数在加载另一个场景之前标记要保留的对象,或使用不同的方式加载LoadSceneMode.Additive而不破坏当前场景。

另一答案

首先,您将两个Actions添加到您的词典中,但两者都使用相同的key

functionsMap.Add(1, () => StartCoroutine(Function1()));
functionsMap.Add(1, () => StartCoroutine(Function2()));

这不会覆盖第一个条目吗?


比你的一般问题是:

虽然functionsMapstatic,但你添加的两个动作/一个动作是非静态的(StartCoroutine总是需要运行MonoBehaviour的实例),因此仅适用于相应的组件! (你谈到了一个Update方法,所以这必须是你第一个场景中附加到GameObject的MonoBehaviour。)

现在,如果您更改场景,如果您不使用DontDestroyOnLoad,则可能会破坏持有该组件的GameObject

结果是你的static字典保持完整和填充意味着key = 1的条目仍然存在,但Value即添加的非静态Action不再可用。

为了避免你应该添加

DontDestroyOnLoad(this.gameObject);

AwakeStart,以防止GameObject持有该组件,从而持有属于你的词典条目中的引用的Action

以上是关于我怎么能修复MissingReferenceException,它告诉我游戏对象在我没有销毁的时候被破坏了?的主要内容,如果未能解决你的问题,请参考以下文章

电脑蓝屏死机怎么办?学会这个方法轻松就能修复!

msvcp140.dll丢失怎么办 这两种办法都能修复

CVE-2017-15715漏洞怎么修复?

安全修复之Web——会话Cookie中缺少HttpOnly属性

每次开机都有smartcard reader,怎么能给去除?

电脑开机显示自动修复,又修复不了 进不了桌面怎么办?