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

如何在Unity中硬重置场景?游戏重生场景未完全重置求助

解决Unity场景完全重置的问题

问题根源分析

你当前的代码里,SceneManager.LoadScene("Game")默认使用LoadSceneMode.Single,但如果玩家对象或关联脚本标记了DontDestroyOnLoad,就会跨场景保留,导致脚本状态无法重置。另外,Movement.OnLoad()在LoadScene后立刻调用,此时新场景的对象还未完成初始化,调用根本不会生效。

可行解决方案

1. 清理不必要的DontDestroyOnLoad

  • 检查玩家对象或相关脚本,若不需要跨场景保留,直接删除DontDestroyOnLoad(this.gameObject)代码。
  • 若必须在特定场景保留对象,可在加载新场景前手动销毁:
    public void startGame()
    {
        GameObject player = GameObject.FindWithTag("Player");
        if(player != null)
        {
            Destroy(player);
        }
        SceneManager.LoadScene("Game");
    }
    

2. 规范加载模式与初始化时机

  • 明确指定加载模式为LoadSceneMode.Single,并将初始化逻辑放到场景加载完成的回调中:
    using UnityEngine.SceneManagement;
    
    public void startGame()
    {
        SceneManager.LoadScene("Game", LoadSceneMode.Single);
        SceneManager.sceneLoaded += OnSceneLoaded;
    }
    
    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if(scene.name == "Game")
        {
            Movement.OnLoad();
            SceneManager.sceneLoaded -= OnSceneLoaded;
        }
    }
    

3. 手动重置脚本状态

如果上述方法无效,在玩家脚本的Awake或Start中手动重置所有需要恢复的状态:

public class Movement : MonoBehaviour
{
    private Vector3 initialPos;
    private int currentHealth;

    void Awake()
    {
        initialPos = transform.position;
        currentHealth = 100;
    }

    void Start()
    {
        ResetPlayerState();
    }

    private void ResetPlayerState()
    {
        transform.position = initialPos;
        currentHealth = 100;
        // 重置其他变量或逻辑
    }

    public static void OnLoad()
    {
        Movement movement = FindObjectOfType<Movement>();
        movement?.ResetPlayerState();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:12:03