You need to enable JavaScript to run this app. Unity 如何跨脚本获取其他脚本的序列化列表值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 07:15:03