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

Unity引擎中如何重启所有场景并重置游戏进度?

Unity场景重启后状态变量不重置的解决方法
  • 排查持久化设置
    先检查两个常见导致状态保留的原因:

    • 去掉不必要的static修饰符:如果key1这类变量不需要跨场景共享,直接删掉static,场景重载时脚本所在对象会重新实例化,变量自动恢复初始值。
    • 移除DontDestroyOnLoad调用:如果脚本挂载的对象被执行过DontDestroyOnLoad(this.gameObject);,场景切换时它会留在内存中,状态不会重置。不需要持久化的话,删掉这段代码。
  • 统一重置状态的回调方案
    如果需要部分对象持久化,但场景重启时要重置状态,可以通过场景加载事件统一处理:

    1. 在全局管理类中监听场景加载完成事件:
      using UnityEngine.SceneManagement;
      
      void OnEnable()
      {
          SceneManager.sceneLoaded += ResetAllStates;
      }
      
      void OnDisable()
      {
          SceneManager.sceneLoaded -= ResetAllStates;
      }
      
      void ResetAllStates(Scene scene, LoadSceneMode mode)
      {
          // 找到所有需要重置状态的脚本实例
          var stateControllers = FindObjectsOfType<StateController>();
          foreach (var controller in stateControllers)
          {
              controller.ResetToInitialState();
          }
      }
      
    2. 在每个包含状态变量的脚本中实现重置方法:
      public class StateController : MonoBehaviour
      {
          public bool key1 = false;
          // 其他状态变量...
      
          public void ResetToInitialState()
          {
              key1 = false;
              // 重置其他变量到初始值
          }
      }
      

    这样不用逐个修改重启代码,统一触发重置逻辑。

  • 确保场景完全卸载加载
    调用LoadScene时明确指定LoadSceneMode.Single模式,确保当前场景被完全卸载后再加载目标场景,非持久化对象会被销毁重建:

    SceneManager.LoadScene("floor1", LoadSceneMode.Single);
    
  • 状态与场景对象绑定
    将key1这类关卡专属的状态变量,挂载在场景内的对象上(比如关卡触发区、道具对象),而不是全局持久化的管理器中。场景重载时这些对象会被重新创建,变量自动回到初始值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:04:57