Unity组件内List退出Play Mode后未重置为默认值问题
解决Unity Play Mode会话间卡组数据保留的问题
嘿,这个问题我之前做卡组系统的时候也踩过坑!Unity里的全局管理类(比如你的GameManager)确实会在Play Mode退出后意外保留数据,尤其是当你用到了单例、DontDestroyOnLoad或者编辑器的Domain Reload被禁用的时候。
问题根源
默认情况下,Unity退出Play Mode时会触发Domain Reload——也就是重新加载所有程序集,重置静态变量和场景对象的状态。但从Unity 2020版本开始,编辑器新增了「Enter Play Mode Settings」优化选项,如果勾选了Disable Domain Reload,为了加快进入Play Mode的速度,Unity会跳过Domain Reload,导致静态变量、DontDestroyOnLoad标记的对象数据被保留到下一次Play Mode会话。
你的GameManager大概率是单例且用了DontDestroyOnLoad,加上可能不小心开启了这个优化选项,才导致卡组列表没被重置。
具体解决方案
1. 检查并调整Domain Reload设置
这是最直接的办法,适合不想写额外代码的情况:
- 打开
Edit > Project Settings > Editor - 找到「Enter Play Mode Settings」区域
- 取消勾选Disable Domain Reload(注意会增加进入Play Mode的加载时间,更适合小型项目)
2. 手动在GameManager中添加重置逻辑
如果你想保留快速进入Play Mode的优化(也就是保留Disable Domain Reload),可以在GameManager中添加代码,主动在Play Mode开始/结束时重置卡组:
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif public class GameManager : MonoBehaviour { // 假设你在Inspector中设置了默认卡组 public List<CardConfig> defaultDeck; private List<CardConfig> activeDeck; public static GameManager instance; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); // 初始化时重置为默认卡组 ResetActiveDeckToDefault(); } else { Destroy(gameObject); } } // 重置卡组到Inspector默认值 private void ResetActiveDeckToDefault() { activeDeck = new List<CardConfig>(defaultDeck); } #if UNITY_EDITOR // 监听Play Mode状态变化,退出时重置数据 private void OnEnable() { EditorApplication.playModeStateChanged += OnPlayModeStateChanged; } private void OnDisable() { EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; } private void OnPlayModeStateChanged(PlayModeStateChange state) { // 退出Play Mode时重置卡组 if (state == PlayModeStateChange.ExitingPlayMode) { ResetActiveDeckToDefault(); } } #endif // 你的其他方法:GetActiveDeck、AddCardToDeck等 public List<CardConfig> GetActiveDeck() => activeDeck; public void AddCardToDeck(CardConfig card) { activeDeck.Add(card); } }
3. 确保Play Mode启动时初始化正确
如果你的GameManager是在场景中实例化的,还要注意避免重复实例导致的数据残留。上面的单例代码已经处理了这个问题:如果已有实例,就销毁新的对象,保证只有一个GameManager存在,且初始化时会重置卡组。
验证方法
修改后按以下步骤测试:
- 退出当前Play Mode
- 再次进入Play Mode,查看初始的调试日志,确认卡组是Inspector设置的默认值
- 添加几张卡片,退出Play Mode
- 重新进入Play Mode,检查初始日志,卡组应该回到默认状态
内容的提问来源于stack exchange,提问作者Thomas Botkins

