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

Unity跨场景调用脚本值时避免运行原脚本及报错问题咨询

Unity跨场景调用脚本值的问题与解决方案

问题描述

想在Unity中实现无需运行其他场景中的脚本即可调用其值,当前尝试用输入的用户名更新表格信息:
这段代码应使用输入的用户名更新表格中的信息

该代码调用了层级视图中空对象上的脚本:
这段代码调用了层级视图中一个空对象上的脚本

但这个脚本属于另一个场景:
该脚本保存在Unity的另一个场景中

运行时报错,原因是目标脚本的Awake和Start仅在其所属场景加载时才会执行,未加载场景中的对象不会被Unity实例化,直接引用会导致空引用错误。

可行解决方案

1. 用ScriptableObject存储共享数据

这是Unity官方推荐的跨场景共享数据方式,数据独立于场景对象存在:

  • 创建ScriptableObject类:
    using UnityEngine;
    
    [CreateAssetMenu(fileName = "UserData", menuName = "ScriptableObjects/UserData")]
    public class UserDataSO : ScriptableObject
    {
        public string userName;
    }
    
  • 在Project窗口右键 → ScriptableObjects → UserData,生成一个数据实例。
  • 输入场景的脚本中直接给这个实例的userName赋值;表格所在场景的脚本直接读取该实例的userName来更新表格,全程无需加载目标场景。

2. 静态类存储全局临时数据

适合存储无需持久化的临时共享数据:

  • 定义静态类:
    public static class GlobalData
    {
        public static string CurrentUserName { get; set; }
    }
    
  • 输入场景中设置值:GlobalData.CurrentUserName = yourInputField.text;
  • 表格场景的脚本直接读取GlobalData.CurrentUserName即可更新,无需依赖任何场景对象。
  • 注意:静态数据在游戏重启或场景重载时会丢失,需要持久化的话可以结合PlayerPrefs。

3. 将目标对象设为DontDestroyOnLoad(需先加载一次场景)

如果需要保留目标脚本的完整逻辑,而非仅数据:

  • 在目标脚本的Awake中添加:
    void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }
    
  • 先加载一次包含该对象的场景,对象会被保留在场景切换后,后续其他场景就能直接引用它的脚本值。但这种方法无法做到“完全不运行目标场景”,需要至少加载一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:20:29