You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity调用LoadScene()重载场景时倒计时器未正确重置

场景重载后倒计时器未重置问题

问题现象

需要实现场景重启功能,当前场景内已配置倒计时器逻辑,调用LoadScene()方法执行场景重载后,倒计时器没有重置为初始状态,仍然保留场景重启前的计时数值,无法正常重新开始计时。

关联实现代码

{
    TheTimer();

    if (stoptimer == true)
    {
        GetComponent<RandomSpawner>().enabled = false;

        textPoin.text = "Total Poin: " + playerObj.GetComponent<Player>().point.ToString();

        playerObj.GetComponent<Player>().enabled = false;
        Destroy(spawnHereObject);
        panelEnd.SetActive(true);
    }
}

问题现象参考

  • 场景重载后计时器保留旧值截图1
  • 场景重载后计时器保留旧值截图2

问题原因&解决方案

原因1:计时器相关状态变量被定义为静态(static)

静态变量归属于类本身,不属于场景内的脚本实例,不会随场景卸载、重载被重置,会一直保留最后一次赋值的结果。

  • 修复方式:移除计时器当前时间、stoptimer控制位、计分相关变量的static修饰符,这类单场景内的实例状态不要用静态变量存储。

原因2:挂载计时器的GameObject被设置为跨场景不销毁

如果挂载计时器脚本的对象调用过DontDestroyOnLoad(gameObject),场景重载时该对象不会被销毁重建,会直接保留之前的所有运行状态。

  • 修复方式:如果不需要该对象跨场景存活,直接移除DontDestroyOnLoad相关调用即可;如果需要保留该对象跨场景使用,就在场景加载完成的回调里手动重置所有计时器状态。

手动重置状态的参考实现

如果需要保留跨场景存活的对象,可以通过监听场景加载事件,在重载完成后主动初始化所有相关状态,代码示例:

using UnityEngine.SceneManagement;

private void OnEnable()
{
    // 注册场景加载完成监听
    SceneManager.sceneLoaded += ResetTimerOnSceneReload;
}

private void OnDisable()
{
    // 移除监听避免内存泄漏
    SceneManager.sceneLoaded -= ResetTimerOnSceneReload;
}

private void ResetTimerOnSceneReload(Scene scene, LoadSceneMode loadMode)
{
    // 重置计时器控制位
    stoptimer = false;
    // 替换为你自己的计时器初始值,例如初始倒计时60秒
    currentCountdownValue = 60f;
    // 恢复之前禁用的组件
    GetComponent<RandomSpawner>().enabled = true;
    playerObj.GetComponent<Player>().enabled = true;
    // 隐藏结算面板
    panelEnd.SetActive(false);
}

额外排查点

检查TheTimer()方法内部逻辑,确认计时累加/递减逻辑仅在stoptimer == false时执行,避免标志位未重置时计时器一直处于停止状态。

内容的提问来源于stack exchange,提问作者Rorin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:54:23