我怎么能修复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对象在场景变化时被破坏?我没有将它作为场景中的游戏对象,它只是在代码本身中定义为公共静态字典。有人可以告诉我我需要做些什么不同请,谢谢你?
问题可能是由于更改场景造成的,因为只是加载另一个场景会破坏当前场景中的所有游戏对象。
新场景的加载会破坏所有当前场景对象。
要解决此问题,您可以使用DontDestroyOnLoad
函数在加载另一个场景之前标记要保留的对象,或使用不同的方式加载LoadSceneMode.Additive而不破坏当前场景。
首先,您将两个Action
s添加到您的词典中,但两者都使用相同的key
。
functionsMap.Add(1, () => StartCoroutine(Function1()));
functionsMap.Add(1, () => StartCoroutine(Function2()));
这不会覆盖第一个条目吗?
比你的一般问题是:
虽然functionsMap
是static
,但你添加的两个动作/一个动作是非静态的(StartCoroutine
总是需要运行MonoBehaviour
的实例),因此仅适用于相应的组件! (你谈到了一个Update方法,所以这必须是你第一个场景中附加到GameObject的MonoBehaviour
。)
现在,如果您更改场景,如果您不使用DontDestroyOnLoad
,则可能会破坏持有该组件的GameObject
结果是你的static
字典保持完整和填充意味着key = 1
的条目仍然存在,但Value
即添加的非静态Action
不再可用。
为了避免你应该添加
DontDestroyOnLoad(this.gameObject);
在Awake
或Start
,以防止GameObject
持有该组件,从而持有属于你的词典条目中的引用的Action
。
以上是关于我怎么能修复MissingReferenceException,它告诉我游戏对象在我没有销毁的时候被破坏了?的主要内容,如果未能解决你的问题,请参考以下文章
安全修复之Web——会话Cookie中缺少HttpOnly属性