Unity 如何跨脚本获取其他脚本的序列化列表值
Unity跨脚本读取自定义序列化Level列表的实现方法
首先明确核心逻辑:你定义的Level结构和levelList列表,必须作为某个继承MonoBehaviour的脚本的成员变量存在,Unity才能对其做序列化、在Inspector面板编辑,其他脚本也才能正常读取到列表值。
首先整理好存列表的宿主脚本,你现有代码的完整可用版本如下:
[System.Serializable] public class Level { public string Name; public Sprite Icon; public bool Unlocked; public bool Interactable; } // 这个脚本需要挂载在场景的激活物体上 public class LevelConfigLoader : MonoBehaviour { // 可在Inspector面板编辑的关卡列表 public List<Level> levelList = new List<Level>(); }
两种常用读取实现方式
方式1:全局静态单例(适合需要全局读取列表的场景)
在上述宿主脚本中加入单例逻辑,其他脚本无需反复绑定引用,直接通过静态实例即可访问列表:
public class LevelConfigLoader : MonoBehaviour { // 全局可访问的静态实例 public static LevelConfigLoader Instance; public List<Level> levelList = new List<Level>(); private void Awake() { // 避免场景内存在多个重复实例 if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; } }
其他脚本读取列表值的示例:
private void Start() { // 先做空值判断,避免场景未挂载对应脚本时报错 if (LevelConfigLoader.Instance == null) return; // 读取索引为1的关卡名称 string targetLevelName = LevelConfigLoader.Instance.levelList[1].Name; // 读取对应关卡的可交互状态 bool levelInteractable = LevelConfigLoader.Instance.levelList[1].Interactable; }
方式2:直接组件引用(适合小范围明确绑定的场景)
如果不需要全局访问列表,可在需要读值的脚本中定义公开的宿主脚本类型变量,在Inspector面板把挂了LevelConfigLoader的物体拖入绑定,直接通过引用读取列表:
// 这是需要读取关卡列表的目标脚本,比如关卡UI脚本 public class LevelUIPanel : MonoBehaviour { // Inspector中绑定存了列表的脚本对象 public LevelConfigLoader configSource; private void Start() { if (configSource == null) { Debug.LogError("未绑定关卡列表来源!"); return; } // 直接通过绑定的引用读取列表值 Sprite firstLevelIcon = configSource.levelList[0].Icon; bool firstLevelUnlocked = configSource.levelList[0].Unlocked; } }
常见踩坑提醒
- 自定义
Level类必须添加[System.Serializable]特性,否则Unity无法识别列表的元素结构,Inspector中不会显示可编辑的列表字段 - 存放列表的脚本必须挂载在激活状态的场景物体上,挂在未激活物体、未拖入场景的Prefab上的列表,运行时无法被正常读取
- 读取指定索引的列表元素前,先判断列表长度是否满足要求,比如要读索引2的元素,先检查
levelList.Count > 2,避免触发数组越界报错 - 注意脚本执行时序:不要在
Awake()阶段直接跨脚本读取其他脚本的列表值,优先把读取逻辑放在Start()中,等所有挂载脚本的初始化完成后再取值,避免读到空值
内容的提问来源于stack exchange,提问作者Beatriz Morais
相关产品推荐
相关产品推荐

