首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我没有销毁游戏对象的时候,我怎样才能修复告诉我游戏对象被销毁的MissingReferenceException呢?

当我没有销毁游戏对象的时候,我怎样才能修复告诉我游戏对象被销毁的MissingReferenceException呢?
EN

Stack Overflow用户
提问于 2018-11-20 16:59:52
回答 2查看 1K关注 0票数 1

我有这样的代码。

代码语言:javascript
运行
复制
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.,我都会遇到同样的问题。

是什么原因造成了这种情况,是什么原因使我能够避免犯同样的错误?

编辑:这个问题被标记为重复,但我不相信的链接适用于我的情况,或者如果它是,我不明白如何。它说静态对象不会在场景变化中重新加载,字典被定义为静态对象。我还试着把它改为非静态的,结果是一样的。

我的代码中有几十个游戏对象,与任何其他对象都没有这个问题,所以我假设这个问题与如何定义字典对象有关。是否有办法防止字典对象在场景变化时被销毁?我没有把它作为场景中的游戏对象,它只是在代码中被定义为一个公共静态字典。有人能告诉我我需要做些什么吗?谢谢?

EN

回答 2

Stack Overflow用户

发布于 2018-11-20 17:27:48

问题可能是由更改场景引起的,因为简单地加载另一个场景会破坏当前场景中的所有游戏对象。

根据Object.DontDestroyOnLoad的说法。

一个新场景的负载破坏了所有当前场景对象。

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

票数 1
EN

Stack Overflow用户

发布于 2018-11-21 05:42:32

首先,您要在字典中添加两个Action,但两者都具有相同的key

代码语言:javascript
运行
复制
functionsMap.Add(1, () => StartCoroutine(Function1()));
functionsMap.Add(1, () => StartCoroutine(Function2()));

这不是覆盖了第一个条目吗?

比你一般的问题是:

虽然functionsMapstatic,但是您添加的两个动作/一个动作是非静态的(StartCoroutine总是需要一个MonoBehaviour实例来运行),因此只对相应的组件可用!(您谈到了更新方法,因此这必须是第一个场景中附加到MonoBehaviour的GameObject。)

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

结果是,您的static字典保持原样并填充,这意味着带有key = 1的条目仍然存在,但是Value,即添加的非静态Action不再可用。

为了避免这种情况,您应该添加

代码语言:javascript
运行
复制
DontDestroyOnLoad(this.gameObject);

AwakeStart中,以防止GameObject保存组件,从而保存字典中条目中的引用的Action

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53397939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档