我有这样的代码。
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.,我都会遇到同样的问题。
是什么原因造成了这种情况,是什么原因使我能够避免犯同样的错误?
编辑:这个问题被标记为重复,但我不相信的链接适用于我的情况,或者如果它是,我不明白如何。它说静态对象不会在场景变化中重新加载,字典被定义为静态对象。我还试着把它改为非静态的,结果是一样的。
我的代码中有几十个游戏对象,与任何其他对象都没有这个问题,所以我假设这个问题与如何定义字典对象有关。是否有办法防止字典对象在场景变化时被销毁?我没有把它作为场景中的游戏对象,它只是在代码中被定义为一个公共静态字典。有人能告诉我我需要做些什么吗?谢谢?
发布于 2018-11-20 17:27:48
问题可能是由更改场景引起的,因为简单地加载另一个场景会破坏当前场景中的所有游戏对象。
根据Object.DontDestroyOnLoad的说法。
一个新场景的负载破坏了所有当前场景对象。
要解决这个问题,您可以使用DontDestroyOnLoad函数在加载另一个场景之前标记要保留的对象,或者使用不同的方式加载LoadSceneMode.Additive,而不破坏当前场景。
发布于 2018-11-21 05:42:32
首先,您要在字典中添加两个Action,但两者都具有相同的key。
functionsMap.Add(1, () => StartCoroutine(Function1()));
functionsMap.Add(1, () => StartCoroutine(Function2()));这不是覆盖了第一个条目吗?
比你一般的问题是:
虽然functionsMap是static,但是您添加的两个动作/一个动作是非静态的(StartCoroutine总是需要一个MonoBehaviour实例来运行),因此只对相应的组件可用!(您谈到了更新方法,因此这必须是第一个场景中附加到MonoBehaviour的GameObject。)
现在,如果您更改场景,如果不使用GameObject,则持有该组件的DontDestroyOnLoad可能会被销毁。
结果是,您的static字典保持原样并填充,这意味着带有key = 1的条目仍然存在,但是,Value,即添加的非静态Action不再可用。
为了避免这种情况,您应该添加
DontDestroyOnLoad(this.gameObject);在Awake或Start中,以防止GameObject保存组件,从而保存字典中条目中的引用的Action。
https://stackoverflow.com/questions/53397939
复制相似问题