【问题标题】:Application.LoadLevel - Leaves behind multiple instances of scripts / objectsApplication.LoadLevel - 留下多个脚本/对象实例
【发布时间】:2014-08-27 05:28:09
【问题描述】:

我正在尝试通过以下方式从附加到主摄像机的脚本重新启动当前关卡:

Application.LoadLevel (Application.loadedLevel);

一旦我完成它,一个脚本的多个实例正在运行(可能有很多我还没有检查)。例如,我使用一个脚本来订阅来自多个脚本的事件,以减少“剩余子弹”和“得分”。

当我注意到它们被减少或增加多个数字而不是一次一步时,我在拍摄时使用 Debug.Log() 进行打印。它在第一个 Application.loadLevel 之后打印两次,然后在第二次重置后打印三次,依此类推。每次我重新启动场景时,脚本都会运行很多次,“分数”/“剩余子弹”会减少或增加很多次。

还有一个脚本存在 null animator 问题,我认为这也是多实例问题造成的。

由于多实例问题,一切看起来都变得一团糟。我也绝对没有 DontDestroyOnLoad 在我的游戏中的任何地方。

我使用事件和委托。在我发布事件的地方,当我使用 Debug.Log() 查看它是否发布了这么多次时,它只按预期打印一次。但是监听这些事件的脚本:

void OnEnable()
{
    BulletController.scoreUP += scoreIncrease;
    BulletController.bulletCreated += bulletDecrease;
}
void OnDisable()
{
    BulletController.scoreUP -= scoreIncrease;
    BulletController.bulletCreated -= bulletDecrease;
}

每次重新启动场景时监听并执行两次或三次左右。

【问题讨论】:

  • 只是为了确定,您确定 OnDisable 调用发生了吗?

标签: c# unity3d


【解决方案1】:

您的问题与您的 OnDisable 功能有关。销毁对象时,不会调用 OnDisable。

您需要一个名为 OnDestroy 的函数,它以相同的方式取消订阅这些事件(您可能希望保留 OnDisable 函数,以防有任何对象被您禁用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多