Unity引擎中如何重启所有场景并重置游戏进度?
Unity场景重启后状态变量不重置的解决方法
排查持久化设置
先检查两个常见导致状态保留的原因:- 去掉不必要的
static修饰符:如果key1这类变量不需要跨场景共享,直接删掉static,场景重载时脚本所在对象会重新实例化,变量自动恢复初始值。 - 移除
DontDestroyOnLoad调用:如果脚本挂载的对象被执行过DontDestroyOnLoad(this.gameObject);,场景切换时它会留在内存中,状态不会重置。不需要持久化的话,删掉这段代码。
- 去掉不必要的
统一重置状态的回调方案
如果需要部分对象持久化,但场景重启时要重置状态,可以通过场景加载事件统一处理:- 在全局管理类中监听场景加载完成事件:
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(); } } - 在每个包含状态变量的脚本中实现重置方法:
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
相关产品推荐
相关产品推荐

