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

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存在,且初始化时会重置卡组。

验证方法

修改后按以下步骤测试:

  1. 退出当前Play Mode
  2. 再次进入Play Mode,查看初始的调试日志,确认卡组是Inspector设置的默认值
  3. 添加几张卡片,退出Play Mode
  4. 重新进入Play Mode,检查初始日志,卡组应该回到默认状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:25:25