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

