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

Unity C# 如何向序列化嵌套List中添加Texture元素

问题根因

你的代码报错和序列化逻辑本身无关,是基础语法使用错误:

  • texInfo是List<TextureInfo>类型的集合,本身不存在textures成员,无法直接调用texInfo.textures.Add
  • C#对象初始化器语法使用错误,不能在初始化块内直接写无归属的textures.Add(texture)语句

Unity可序列化列表的增删操作和普通C#列表逻辑完全一致,只要类、字段标记了符合要求的序列化特性,常规列表操作的结果都能被序列化系统正常识别,不需要调用特殊的序列化API。

正确实现代码

写法1:分步实现(逻辑清晰,推荐使用)

[System.Serializable]
public class TextureInfo
{
    public List<Texture> textures = new List<Texture>();
}

public List<TextureInfo> texInfo = new List<TextureInfo>();
public Texture texture;

public void Start(){
    // 第一步:创建新的TextureInfo实例
    TextureInfo newTexInfo = new TextureInfo();
    // 第二步:向新实例的内部textures列表添加目标纹理对象
    newTexInfo.textures.Add(texture);
    // 第三步:将填充完成的TextureInfo实例添加到外层列表
    texInfo.Add(newTexInfo);
}

写法2:集合初始化器简写(代码更简洁)

熟悉C#语法的情况下,可以用集合初始化器简化代码,不需要分步声明变量:

public void Start(){
    texInfo.Add(new TextureInfo 
    {
        textures = { texture }
    });
}

注意:这种写法里的textures = { texture }不是重新给textures赋值新列表,是C#内置语法糖,会自动调用类中已经初始化好的textures列表的Add方法传入texture对象,和分步写法逻辑完全一致。

序列化适配注意事项
  • 你当前的代码已经满足Unity序列化要求:TextureInfo类标记了[System.Serializable],外层列表、内部纹理列表都是public字段,Texture作为UnityEngine.Object子类本身支持序列化,按上述写法添加的元素可以正常在Inspector面板显示、被序列化系统保存
  • 不要在添加元素的逻辑中重复new内部的textures列表,类定义中已经完成了列表初始化,重复赋值会覆盖原有引用,导致已存储的纹理数据丢失、序列化异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:39:17