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

Unity中不同场景之间读取可变变量值的最优方式是什么

Unity跨场景传递变量最优解决方案

你此前用static变量实现时出现编辑报错,核心原因是静态变量不会被Unity序列化,无法在Inspector面板直接编辑,且场景切换时容易出现值残留、意外清空等生命周期问题,属于该方案的固有缺陷。以下是不同场景下的最优替代方案:

方案1:DontDestroyOnLoad全局单例(日常开发首选,最通用)

工业级项目最常用的跨场景传参方案,稳定性远高于纯static变量,同时支持Inspector编辑

  • 实现逻辑:将需要全局共享的变量挂载到不会随场景切换销毁的单例对象上,全局可直接读写
  • 示例代码:
public class GlobalDataManager : MonoBehaviour
{
    // 全局唯一单例实例
    public static GlobalDataManager Instance;
    // 声明需要跨场景传递的变量,支持在Inspector面板直接编辑
    public int playerHp;
    public string playerName;

    private void Awake()
    {
        // 单例校验,确保全局只有一个实例
        if(Instance == null)
        {
            Instance = this;
            // 标记对象不随场景卸载销毁
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}
  • 调用方式:任意脚本中直接通过GlobalDataManager.Instance.playerHp即可读写对应变量

方案2:PlayerPrefs(适用需要跨游戏启动留存的参数)

适合需要在游戏退出重启后仍然保留的参数存储

  • 用法:
    • 存值:PlayerPrefs.SetInt("参数名", 数值),支持int、float、string三类基础类型
    • 取值:PlayerPrefs.GetInt("参数名", 默认值),默认值为参数不存在时的返回值
    • 落地:修改后调用PlayerPrefs.Save()确保数据写入本地存储
  • 注意:复杂类型需要自行序列化为字符串后再存储

方案3:LoadScene带参重载(适用单次场景切换临时传参)

Unity 2017及以上版本支持加载场景时传递自定义参数,适合不需要长期留存的一次性传参场景

  • 示例代码:
// 传参方
SceneManager.LoadScene("目标场景名", new LoadSceneParameters());
// 接收方在目标场景脚本的Awake/Start生命周期中读取加载参数即可

选型建议:绝大多数开发场景优先选用DontDestroyOnLoad单例方案,兼顾灵活性和稳定性,可完全覆盖static变量的使用需求且没有对应缺陷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:06:04