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
相关产品推荐
相关产品推荐

