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

Unity场景重启后脚本失效问题求助

场景重启后脚本失效的排查方案

以下是几种常见原因和对应的解决方法:

  • 跨场景保留脚本未重新初始化
    如果脚本所在对象用了DontDestroyOnLoad,场景重启后Awake()和Start()不会再次执行。要是脚本逻辑依赖这两个方法里的初始化,就会出现看似正常但功能失效的情况。
    解决办法:监听场景加载完成事件,手动触发初始化逻辑:

    using UnityEngine.SceneManagement;
    
    void OnEnable()
    {
        SceneManager.sceneLoaded += HandleSceneLoaded;
    }
    
    void OnDisable()
    {
        SceneManager.sceneLoaded -= HandleSceneLoaded;
    }
    
    void HandleSceneLoaded(Scene loadedScene, LoadSceneMode loadMode)
    {
        // 这里调用你的初始化方法
        SetupScript();
    }
    
  • 按钮事件引用失效
    场景重启后,新生成的按钮是全新对象,若你的脚本是跨场景保留的,之前在Inspector绑定的按钮引用会指向旧场景已销毁的对象,导致点击后逻辑无法触发。
    解决办法:通过代码动态绑定按钮事件,避免Inspector绑定:

    void HandleSceneLoaded(Scene loadedScene, LoadSceneMode loadMode)
    {
        var restartBtn = GameObject.Find("你的按钮名称").GetComponent<UnityEngine.UI.Button>();
        restartBtn.onClick.RemoveAllListeners();
        restartBtn.onClick.AddListener(RestartCurrentScene);
    }
    
    void RestartCurrentScene()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name, LoadSceneMode.Single);
    }
    
  • 静态变量状态未重置
    静态变量在场景重启后不会自动重置,比如你用静态标记hasInitialized控制初始化流程,第一次加载后设为true,后续场景重启就会跳过初始化。
    解决办法:在场景加载时手动重置静态变量,或者改用非静态变量存储场景相关状态。

  • 场景加载模式错误
    若使用LoadSceneMode.Additive加载场景,旧场景对象不会被销毁,多个脚本实例可能引发冲突,导致新场景的脚本无法正常工作。
    解决办法:确保重启场景时使用单场景加载模式:

    SceneManager.LoadScene(SceneManager.GetActiveScene().name, LoadSceneMode.Single);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:57:41