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

Unity 2D技术问询:如何从其他场景控制同场景内不同关卡?

问题解答

一、跨场景直接启用/禁用脚本无效的原因

当目标场景未加载时,场景内的所有游戏对象和脚本组件都不在当前运行时的内存中,你无法直接从其他场景对它们进行启用/禁用操作——这就是你之前操作未生效的核心原因。

二、可行方案:通过全局状态传递关卡激活指令

你可以用全局状态标记的方式,让目标场景加载后自动执行脚本的启用/禁用逻辑,常用两种实现方式:

1. 使用ScriptableObject存储全局状态

  • 创建一个名为LevelState的ScriptableObject类,添加int currentActiveLevel字段;
  • 在菜单场景中,用户选择第一关时,给LevelState.currentActiveLevel赋值为1;
  • 在关卡场景中添加初始化脚本(比如LevelInitializer),在Start方法中读取状态并执行逻辑:
    public LevelState levelState;
    public List<MonoBehaviour> levelScripts; // 将所有关卡脚本拖入列表
    
    void Start()
    {
        // 先禁用所有关卡脚本
        foreach (var script in levelScripts)
        {
            script.enabled = false;
        }
        // 启用目标关卡的脚本
        if (levelState.currentActiveLevel >= 0 && levelState.currentActiveLevel < levelScripts.Count)
        {
            levelScripts[levelState.currentActiveLevel].enabled = true;
        }
    }
    

2. 使用单例全局管理器

  • 创建GameManager单例类,添加int targetLevel字段,在Awake中调用DontDestroyOnLoad(gameObject)确保场景切换不销毁;
  • 菜单场景选择关卡时,给GameManager.Instance.targetLevel赋值;
  • 关卡场景的初始化脚本读取该值,执行和上述一致的脚本启用/禁用逻辑。

三、是否该将每个关卡放在不同场景?

更推荐把每个关卡拆分为独立场景,原因如下:

  • 资源加载更高效:仅加载当前关卡资源,降低内存占用;
  • 项目管理更清晰:每个关卡的逻辑、资源隔离,避免同场景内对象过多导致的混乱;
  • 后续扩展更便捷:新增关卡直接添加新场景即可,无需修改原有场景结构。

关于金币计数这类全局系统,完全可以正常工作:

  • 将金币管理逻辑放在GameManager这类单例对象中,标记DontDestroyOnLoad,场景切换时对象和数据都会保留;
  • 其他场景的脚本直接通过GameManager.Instance.GoldCount读取或修改金币数值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:00